在MongoDB 2.0.6中,当试图存储包含字符串字段的文档或查询文档时,字符串的值包含BMP之外的字符,我会收到大量错误,例如:“不正确的UTF-16:55357 “,或”缓冲太小“
允许在Mongo中存储和查询多语言字符串的设置,更改或建议是什么,特别是那些包含这些字符超过0xFFFF的字符串?
感谢。
答案 0 :(得分:8)
这里有几个问题:
1)请注意,MongoDB使用BSON格式存储所有文档。另请注意,BSON规范引用的是UTF-8字符串编码,而不是UTF-16编码。
参考:http://bsonspec.org/#/specification
2)所有驱动程序(包括mongo shell中的JavaScript驱动程序)都应该正确处理编码为UTF-8的字符串。 (如果他们没有那么这就是一个错误!)许多驱动程序恰好也正确地处理了UTF-16,尽管据我所知,UTF-16没有得到官方的支持。
3)当我使用Python驱动程序测试时,MongoDB可以成功加载并返回包含断开的UTF-16代码对的字符串值。但是,我无法使用mongo shell加载损坏的代码对,也无法将包含损坏代码对的字符串存储到shell中的JavaScript变量中。
4)mapReduce()使用正确的UTF-16代码对在字符串数据上正确运行,但在尝试对包含损坏代码对的字符串数据运行mapReduce()时会产生错误。
当MongoDB尝试将BSON转换为JavaScript变量以供JavaScript引擎使用时,mapReduce()似乎失败了。
5)我已经为此问题提交了Jira问题SERVER-6747。随意关注并投票。