Может ли MongoDB хранить и манипулировать строками UTF-8 с кодовыми точками вне базовой многоязычной плоскости?
В MongoDB 2.0.6 при попытке сохранить документы или документы запроса, содержащие строковые поля, где значение строки включает символы вне BMP, я получаю массу ошибок, таких как: "Не правильно UTF-16: 55357", или "буфер слишком маленький"
Какие настройки, изменения или рекомендации существуют для разрешения хранения и запроса многоязычных строк в Mongo, особенно те, которые содержат эти символы выше 0xFFFF?
Благодарю.
1 ответ
Здесь есть несколько вопросов:
1) Помните, что MongoDB хранит все документы в формате BSON. Также обратите внимание, что спецификация BSON относится к кодировке строки UTF-8, а не к кодировке UTF-16.
Ссылка: http://bsonspec.org/
2) Все драйверы, включая драйвер JavaScript в оболочке mongo, должны правильно обрабатывать строки, закодированные как UTF-8. (Если они этого не делают, то это ошибка!) Многие драйверы также правильно обрабатывают UTF-16, хотя, насколько я знаю, UTF-16 официально не поддерживается.
3) Когда я протестировал это с драйвером Python, MongoDB мог успешно загрузить и вернуть строковое значение, которое содержало неверную кодовую пару UTF-16. Однако я не мог загрузить поврежденную пару кода, используя оболочку mongo, и не мог сохранить строку, содержащую поврежденную пару кода, в переменную JavaScript в оболочке.
4) mapReduce() корректно запускается для строковых данных с использованием правильной пары кодов UTF-16, но при попытке запуска mapReduce() для строковых данных, содержащих поврежденную пару кодов, выдается ошибка.
Похоже, что mapReduce() завершается ошибкой, когда MongoDB пытается преобразовать BSON в переменную JavaScript для использования механизмом JavaScript.
5) Я подал заявку на выпуск Jira SERVER-6747 для этой проблемы. Не стесняйтесь следить за этим и голосовать.