En MongoDB 2.0.6, al intentar guardar documentos o consulta de los documentos que contienen los campos de cadena, donde el valor de una cadena incluir caracteres fuera del BMP, me sale una serie de errores como: «No correcta UTF-16: 55357», o «buffer es demasiado pequeño»

¿Qué opciones de configuración, los cambios o las recomendaciones están ahí para permitir el almacenamiento y consulta de multi-lingual cadenas en Mongo, en particular de aquellos que incluir estos caracteres por encima de 0xFFFF?

Gracias.

  • Puedes publicar exactamente los errores que estás recibiendo? Además, el controlador que está utilizando para acceder a MongoDB? (Esto podría ser un error en el controlador.)
  • La forma más error se parece a esto: com.mongodb.CommandResult$CommandFailure: comando error [error de comando [mapreduce] { «serverUsed» : «127.0.0.1:27017» , «afirmación» : «No es correcta UTF-16: 55356» , «assertionCode» : 13498 , «error» : «db error de aserción» , «aceptar» : 0.0}
  • Claramente, por el camino, que debo tener una referencia UTF-16 en mi pregunta. El código se quejan es D83C, que estoy bastante seguro de que es el código alto de un UTF-16 par suplente algo en un código adicional de avión.
  • De acuerdo a las dependencias.groovy en el archivo de MongoDB-GORM plugin, que es el uso de MongoDB controlador Java versión 2.7.1 … compile(«org.mongodb:mongo-java-conductor:2.7.1», y se excluye a) …
  • La excavación en la MongoDB código, veo que este mensaje de error viene de Mono Araña, tras el fracaso de JS_EncodeCharacters, sobre o cerca de la línea 205 en mongo/scripting/engine_spidermonkey.cpp. Gracias por la comprobación de este, @WilliamZ
  • OK @Eli-necesito algunos datos más para avanzar en esto. El mensaje de error se refiere a mapReduce(), que no menciona en su pregunta original. Por favor, hágamelo saber (mediante el nativo de Java conductor): (a) que son capaces de insertar datos utilizando esta de caracteres UTF-16? (b) que son capaces de consulta de datos utilizando este de caracteres UTF-16 en el modelo de consulta? Con esta información voy a ser capaz de tomar el siguiente paso en el diagnóstico.
  • OK, @WilliamZ, voy a darle una oportunidad. Puede que me tome un poco. Sospecho que el problema principal es la inserción de una cadena con una fractura de un par suplente en ella. Cuando he añadido un filtro para evitar tales cadenas se inserta, el problema aparentemente se detuvo. Y, tienes razón, debería haber mencionado que se muestra al ejecutar una mapreduce. No he visto el informe de errores en una inserción o una consulta. Pero mis preguntas son bastante raros en comparación con mi mapreduce llamadas, por lo que no puede ser muy indicativo.
  • Por cierto, cuando digo «roto par suplente» de arriba, me refiero a la palabra alta de la pareja fue en la cadena, pero la palabra baja fue probablemente falta. Imagina una cadena que termina con \uD83C
  • Mi mejor conjetura en este punto es que la MongoDB motor controla esta bien, pero algo en el mono araña motor de JavaScript se rompe. La razón es que todos los MapReduce pide que se pase a través del motor de JavaScript, mientras que el directo de operaciones CRUD no. Si usted puede crear una prueba reproducible caso, su mejor apuesta es, probablemente, para presentar una Jira de entradas.
  • Eso suena probable, dado lo que he visto hasta ahora. Gracias, @WilliamZ
  • Yo no soy un Maravilloso chico :-), y sé menos sobre UTF lo que me gustaría. Puedes publicar una muestra de Groovy código que almacena un «roto par suplente»? Yo no puedo avanzar en mi diagnóstico sin que.
  • Seguramente puedo describir lo más rápido que puedo código. Todo esto es para crear una colección con los documentos que este aspecto (id omitido): { «nombre»:»foobar», «puntuación»:10}} a Continuación, insertar un documento en el que se ve como esto: { «nombre»:»\uDB3C», «puntuación»:5} por último, hacer un mapreduce para sumar todos los puntos usando el nombre de la clave y usted debe golpear el problema. La cadena «\uD83C» es un buen UTF-16 cadena ya que solo código de 16 bits no se supone que estamos solos, sino que debe ser seguido por otro código que empieza con 0xDCxx.

InformationsquelleAutor Eli | 2012-07-31

1 Comentario

  1. 8

    Hay varias cuestiones aquí:

    1) por Favor, ser conscientes de que MongoDB almacena todos los documentos utilizando el formato BSON. También tenga en cuenta que el HIJO de especificación se refiere a una cadena UTF-8 codificación, no una codificación UTF-16.

    Ref: http://bsonspec.org/#/specification

    2) Todos los conductores, incluyendo el JavaScript del controlador en el mongo shell, debe manejar adecuadamente las cadenas que están codificados como UTF-8. (Si no, entonces es un error!) Muchos de los controladores de pasar a manejar UTF-16 adecuadamente, así, aunque por lo que yo sé, UTF-16 no está soportado oficialmente.

    3) Cuando he probado con el Python conductor, MongoDB puede cargar correctamente y devolver un valor de cadena que contiene un roto de código UTF-16 par. Sin embargo, yo no podía cargar un código roto par mediante el mongo shell, ni podía almacenar una cadena que contiene un código roto par en una variable de JavaScript en el shell.

    4) mapReduce() se ejecuta correctamente en la cadena de datos a través de una correcta código UTF-16 par, pero se producirá un error al intentar ejecutar mapReduce() en la cadena de datos que contiene un código roto par.

    Parece que la mapReduce() está fallando cuando MongoDB está tratando de convertir el HIJO a una variable de JavaScript para su uso por el motor de JavaScript.

    5) he presentado Jira problema del SERVIDOR-6747 para este problema. Siéntase libre de seguir y votar arriba.

    • Excelente. Gracias @WilliamZ para buscar en el este.

Dejar respuesta

Please enter your comment!
Please enter your name here