【发布时间】:2013-08-08 20:04:03
【问题描述】:
来自 pymongo 文档:
MongoDB 以 BSON 格式存储数据。 BSON 字符串是 UTF-8 编码的,所以 PyMongo 必须确保 它存储的任何字符串都只包含有效的 UTF-8 数据。常规字符串 () > 已验证并按原样存储。 Unicode 字符串 () 首先是 UTF-8 编码的。 > 我们的示例字符串在 Python shell 中表示为 u'Mike' 而不是 “迈克”是 PyMongo 将每个 BSON 字符串解码为 Python unicode 字符串,而不是常规字符串 字符串。”
数据库只能存储 UTF-8 编码的字符串对我来说似乎有点傻,但是 pymongo 中的返回类型是 unicode,这意味着我对文档中的每个字符串做的第一件事就是再次调用 encode ('utf-8') 就可以了。有没有办法解决这个问题,即告诉 pymongo 不要把 unicode 还给我,而只给我原始的 str?
【问题讨论】:
-
你为什么想要那个?
-
我正在使用几个仅适用于编码字符串的库,例如bcrypt。很高兴能够向我的项目的开发人员保证他们正在使用的所有数据都是字符串,而不是必须添加大量的类型检查。
-
问题在于“只是原始 str”。由于它是 unicode,因此那里可能存在无法表示为 str 的字符。所以lib级别的转换是不可行的。我只想告诉您的开发人员,他们将得到的一切都是 u"" 并且他们必须对其进行转换......这也可以为您节省不必要的转换开销。
-
UTF-8 维基百科条目的第一句话:“UTF-8(UCS 转换格式—8 位 [1])是一种可变宽度编码,可以表示 Unicode 字符中的每个字符放。”所以,事实上,所有的 unicode 都可以用 UTF-8 编码的原始字符串来表示。我们并没有真正解决我所问的问题。
-
请记住,UTF-8 是 unicode 的一种实现编码,在此用于所有目的:UTF-8 == unicode。所以你在这里得到的是连贯的。 unicode 字符的原始字符串 == python 中的
unicode类型,而不是str。这是因为str可以仅代表 asci 字符,当然不是所有 unicode characters.
标签: pymongo