MongoDB 2.0.6 で、文字列の値に BMP 以外の文字が含まれる文字列フィールドを含むドキュメントを保存またはクエリしようとすると、「UTF-16 が適切ではありません: 55357」、または「バッファが小さすぎます」
Mongo での多言語文字列、特に 0xFFFF を超えるこれらの文字を含む文字列の保存とクエリを許可するために、どのような設定、変更、または推奨事項がありますか?
ありがとう。
MongoDB 2.0.6 で、文字列の値に BMP 以外の文字が含まれる文字列フィールドを含むドキュメントを保存またはクエリしようとすると、「UTF-16 が適切ではありません: 55357」、または「バッファが小さすぎます」
Mongo での多言語文字列、特に 0xFFFF を超えるこれらの文字を含む文字列の保存とクエリを許可するために、どのような設定、変更、または推奨事項がありますか?
ありがとう。
ここにはいくつかの問題があります。
1) MongoDB はすべてのドキュメントを BSON 形式で保存することに注意してください。また、BSON 仕様は、UTF-16 エンコーディングではなく、UTF-8 文字列エンコーディングを参照していることにも注意してください。
参照: http://bsonspec.org/#/specification
2) mongo シェルの JavaScript ドライバーを含むすべてのドライバーは、UTF-8 としてエンコードされた文字列を適切に処理する必要があります。(そうでない場合はバグです!) ドライバの多くはたまたま UTF-16 を適切に処理しますが、私の知る限り、UTF-16 は公式にはサポートされていません。
3) これを Python ドライバーでテストしたところ、MongoDB は壊れた UTF-16 コード ペアを含む文字列値を正常に読み込んで返すことができました。ただし、mongo シェルを使用して壊れたコード ペアを読み込むことも、壊れたコード ペアを含む文字列をシェルの JavaScript 変数に格納することもできませんでした。
4) mapReduce() は正しい UTF-16 コード ペアを使用して文字列データに対して正しく実行されますが、破損したコード ペアを含む文字列データに対して mapReduce() を実行しようとするとエラーが発生します。
MongoDB が JavaScript エンジンで使用するために BSON を JavaScript 変数に変換しようとしているときに、mapReduce() が失敗しているようです。
5) この問題について Jira の問題 SERVER-6747 を提出しました。気軽にフォローして投票してください。