mensaje mas lanzar excepcion errores error comunes code capturar mysql hibernate utf-8 utf8mb4

mas - lanzar excepcion mysql



MySQL arroja un error de valor de cadena incorrecto (5)

Intento guardar el siguiente tweet en una columna de texto largo / utf8 charset / MySQL 5.5. base de datos con almacenamiento MyISAM en.

También probamos utf8mb4, utf16, utf32 charsets pero no podemos superar este problema.

tweet="@Dorable_Dimples: Okay enough of those #IfYouWereMines I''m getting dep ressed. #foreveralone ?" lol yes mysql> ALTER DATABASE foo CHARACTER SET utf8 COLLATE utf8_bin; mysql> show variables like ''char%''; +--------------------------+-------------------------------------------+ | Variable_name | Value | +--------------------------+-------------------------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /rdsdbbin/mysql-5.5.12.R1/share/charsets/ | Incorrect string value: ''/xF0/x9F/x98/x94/xE2/x80...'' for column ''tweet'' at row 1 Unable to store tweet "@Dorable_Dimples: Okay enough of those #IfYouWereM ines I''m getting depressed. #foreveralone ?" lol yes javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCExcept ion: could not insert at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityMana gerImpl.java:1387) at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityMana gerImpl.java:1315) at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityMana gerImpl.java:1321) at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityMana gerImpl.java:843) at java.util.TimerThread.mainLoop(Timer.java:512) at java.util.TimerThread.run(Timer.java:462) at org.hibernate.exception.SQLStateConverter.handledNonSpecificException( SQLStateConverter.java:140) at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.ja va:128) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelpe r.java:66) at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(Abstra ctReturningDelegate.java:64) at org.hibernate.persister.entity.AbstractEntityPersister.insert(Abstract EntityPersister.java:2345) at org.hibernate.persister.entity.AbstractEntityPersister.insert(Abstract EntityPersister.java:2852) at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentity InsertAction.java:71) at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273) at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplica te(AbstractSaveEventListener.java:320) at org.hibernate.event.def.AbstractSaveEventListener.performSave(Abstract SaveEventListener.java:203) at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId( AbstractSaveEventListener.java:129) at org.hibernate.ejb.event.EJB3PersistEventListener.saveWithGeneratedId(E JB3PersistEventListener.java:69) at org.hibernate.event.def.DefaultPersistEventListener.entityIsTransient( DefaultPersistEventListener.java:179) at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultP ersistEventListener.java:135) at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultP ersistEventListener.java:61) at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:808) at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:782) at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:786) at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityMana gerImpl.java:837) ... 5 more Caused by: java.sql.SQLException: Incorrect string value: ''/xF0/x9F/x98/x94/xE2/x 80...'' for column ''tweet'' at row 1 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3609) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3541) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2002) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2163) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2624) at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.jav a:2127) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java: 2427) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java: 2345) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java: 2330) at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAnd Extract(IdentityGenerator.java:94) at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(Abstra ctReturningDelegate.java:57)


¿Por qué tiene texto fuera de las comillas en su ejemplo, es decir, ''lol yes''?

tweet="@Dorable_Dimples: Okay enough of those #IfYouWereMines I''m getting depressed. #foreveralone ?" lol yes


Es el personaje al final del tweet lo que está causando el problema.

Parece un personaje ''emoji'', también conocido como cara sonriente japonesa, pero no se muestra para mí ni en Chrome ni en Safari.

Existen problemas conocidos que almacenan caracteres utf de 4 bytes en algunas versiones de MySQL. Aparentemente, debe usar utf8mb4 para representar caracteres UTF de 4 bytes, ya que el conjunto de caracteres utf8 normal solo puede representar caracteres de hasta 3 bytes de longitud y, por lo tanto, no puede almacenar caracteres que estén fuera del plano multilingüe básico.

http://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html

Lo cual es nuevo para mí, ya que básicamente significa que el tipo de datos utf8 en MySQL no es realmente apropiado utf8.

Hay sugerencias de cómo manejar esto aquí ¿Cómo insertar el carácter utf-8 mb4 (emoji en ios5) en mysql? incluso:

"Asegúrate también de que la capa de tu aplicación establece el conjunto de caracteres de las conexiones de la base de datos a utf8mb4. Comprueba que esto esté sucediendo: si estás ejecutando una versión anterior de la biblioteca cliente mysql de tu framework elegido, es posible que no se haya compilado con el soporte utf8mb4. y no configurará el juego de caracteres correctamente. De lo contrario, tendrá que actualizarlo o compilarlo usted mismo ".

Si está utilizando Connector / J, necesita establecer character_set_server = utf8mb4 en la configuración de conexión.

Todos los conjuntos de caracteres deben ser utf8mb4, que puede haber intentado pero no están configurados actualmente.


Me gusta la respuesta de Danask57: es correcta y la forma "correcta" de hacerlo. (Yo mismo lo voté)

Sin embargo, otra solución rápida y sucia es cambiar el esquema. use un varbinary o binario para almacenar la cadena de tweets:

http://dev.mysql.com/doc/refman/5.0/en/binary-varbinary.html

Lo bueno es que no tendrás ningún problema de conjunto de caracteres.

La desventaja es que se perderán la comparación de cadenas y la ordenación, y no podrá indexar el texto completo de la columna.

Solo una sugerencia, pero esta no es la respuesta "correcta", solo una solución rápida y sucia que hace que las cosas funcionen.


Tuve este problema exacto. Para resolver, cambie la codificación predeterminada en el lado del servidor mysql a utf8mb4 siguiendo esta excelente guía: http://mathiasbynens.be/notes/mysql-utf8mb4 .

Recuerde reiniciar su servicio mysqld después de realizar cambios en el archivo de configuración.

Para mí, también necesitaba actualizar el controlador mysql jdbc a la versión 5.1.18 (desde la versión 5.1.6). He leído en alguna parte que debe usar al menos la versión 5.1.14 para que el controlador mysql jdbc funcione bien con la codificación de caracteres utf8mb4. ¡Espero que esto ayude!


el problema está en la cadena "@". la base de datos del motor se interpreta como un personaje especial. hago:

tweet="Dorable_Dimples: Okay enough of those #IfYouWereMines I''m getting dep

ressed #foreveralone? "lol sí