Necesito para ser capaz de almacenar los caracteres como \xF0\x9F\x94\xA5 en mi base de datos, la cual, de acuerdo a este post necesidad UTF8mb4 de codificación.

Así que puedo configurar mi base de datos con

CREATE DATABASE `myDB` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci

y comprobado en el shell de MySQL si fue efectiva:

SHOW FULL COLUMNS FROM myTable;

+---------+------------------+--------------------+----
| Field   | Type             | Collation          | ...
+---------+------------------+--------------------+-----
| id      | int(10) unsigned | NULL               | ...   
| myColumn| text             | utf8mb4_general_ci | ...
+---------+------------------+--------------------+-----

Hasta ahora tan bueno.

Después de ejecutar mi programa, tengo este Excepción:

Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation 'like'
Error Code: 1267

Para el registro: yo estoy usando la de Persistencia de Java API (JPA) en mi webapplication con GlassFish 3.1. El Exception se tira a la hora de ejecutar una consulta con nombre:

@NamedQuery(name = "myTable.findByMyColumn", query = "SELECT c FROM myTable c WHERE c.myColumn LIKE :myColumn")

Sin embargo, parece que el error sólo se produce cuando la consulta de Cadena contiene en realidad los weired caracteres emoji (\xF0\x9F\x94\xA5)

Call: SELECT id, myColumn FROM myDB.myTable WHERE myColumn LIKE ?
bind => [Something something Lorem Ipsum 🇬🇧]  

Así que pensé que en algún lugar todavía puede ser un utf8_general_ci configurar y he intentado poner el COLLATION directamente en la consulta (como se sugiere en este post aquí)

@NamedQuery(name = "myTable.findByMyColumn", query = "SELECT c COLLATE utf8mb4_general_ci FROM myTable c WHERE c.myColumn LIKE :myColumn")

Pero aún nada.

A continuación, he intentado poner la intercalación directamente en la conexión (en GlassFish estoy usando un connection_pool) como yo leer aquí

characterEncoding, UTF8mb4

Pero GlassFish dijo que sólo Connection could not be allocated because: Unsupported character encoding 'UTF8mb4'

La última cosa que hice fue comprobar el Sistema de Base de datos (estoy usando MariaDB)

show variables WHERE variable_name like "col%";
+----------------------+------------------+
| Variable_name        | Value            |
+----------------------+------------------+
| collation_connection | utf8_general_ci  |
| collation_database   | utf32_general_ci |
| collation_server     | utf8_general_ci  |
+----------------------+------------------+

Y ahora estoy completamente perdido…

¿Qué puedo hacer para usar utf8mb4 o utf-32 o cualquier otra cosa que es más avanzado que el simple UTF-8 ?

  • conexión de la piscina de codificación de caracteres falla porque en java, utf-8mb4 es sólo UTF-8. Creo que es la conexión que no está establecido en el derecho de intercalación. ¿Por qué no intenta ejecutar un SET NAMES 'utf8mb4' de consulta durante la inicialización del contexto (o justo antes de su where .. like consulta para propósitos de prueba)?
  • Increíble, ese pequeño truco de los suyos, hizo el truco! La base de datos es la aceptación de la weired caracteres sin quejarse 🙂 Esto puede no ser la manera más eficiente, pero ahora sólo podía ejecutar esto: entityManager.createNativeQuery("SET NAMES 'utf8mb4'"); siempre que puedo esperar de texto que necesita más de utf8. Tal vez usted puede publicar esta respuesta, así que puedo aceptarlo – a menos que tengas más ideas buenas
  • también puede establecer que en my.cnf si usted prefiere, pero se aplican a todas las conexiones (no sé si con alguna desventaja)
  • también, usted puede actualizar su jdbc cliente a una versión más reciente?
  • Esto está diseñado para funcionar en un servidor remoto que no puedo actualizar a mí mismo. Así que todo lo que tenemos es un MariaDB 5.5.36 y servidor GlassFish 3.1.2.2. Sin embargo, no voy a utilizar la base de datos para cualquier otra cosa así que sólo puedo editar my.cnf !
InformationsquelleAutor GameDroids | 2014-10-09

1 Comentario

  1. 11

    Que no es necesario ningún cambio en el lado de Java, como utf8mb4 es sólo UTF-8 en Java.

    Lugar, como se puede ver aquí:

    show variables WHERE variable_name like "col%";
    +----------------------+------------------+
    | Variable_name        | Value            |
    +----------------------+------------------+
    | collation_connection | utf8_general_ci  |
    | collation_database   | utf32_general_ci |
    | collation_server     | utf8_general_ci  |
    +----------------------+------------------+

    la configuración de conexión es aún utf8_general_ci; para establecer en el nivel de conexión, una opción es ejecutar el (mysql específicos) consulta:

    SET NAMES='utf8mb4'

    antes de cualquier intento de utilizar la utf8mb4 intercalación; o, en general, para el servidor de mysql, en /etc/my.cnf:

    [mysql]
    default-character-set = utf8mb4
    
    [mysqld]
    character-set-server = utf8mb4
    collation-server = utf8mb4_unicode_ci

    Otra opción sin cambiar la cadena de conexión, es el uso de un controlador jdbc versión >= 5.1.13:
    http://www.opensubscriber.com/message/[email protected]/14151747.html

    • Gracias. Interesante enlace – yo uso mysql-connector-java-5.1.32 así que debe estar bien cuando se cambia la my.conf

Dejar respuesta

Please enter your comment!
Please enter your name here