MongoDB可以在基本多语言平面之外的代码点存储和操作UTF-8字符串吗?

时间:2012-07-31 19:30:09

标签: mongodb utf-8 multilingual astral-plane gorm-mongodb

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

允许在Mongo中存储和查询多语言字符串的设置,更改或建议是什么,特别是那些包含这些字符超过0xFFFF的字符串?

感谢。

1 个答案:

答案 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。随意关注并投票。