在MongoDB 2.0.6中,当尝试存储文档或查询包含字符串字段的文档(其中字符串的值包含BMP之外的字符)时,我收到大量错误,例如:“不正确的UTF-16:55357”,或者“缓冲区太小”

有哪些设置,更改或建议可允许在Mongo中存储和查询多语言字符串,尤其是那些在0xFFFF以上包含这些字符的字符串?

谢谢。

最佳答案

这里有几个问题:

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。随时关注并投票。

10-01 09:18
查看更多