2012-01-03 11 views
35

Estoy tratando de almacenar el siguiente tweet en una columna de texto largo/utf8 charset/MySQL 5.5. base de datos con almacenamiento MyISAM en.MySQL arroja un error de valor de cadena incorrecto

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) 
+4

¿Podría reducir su qu ción a la información relevante, por favor? –

+4

Supongo que he proporcionado información que es pertinente para el problema, no estoy seguro de lo que puedo reducir. ¿No es prudente proporcionar la información que podría ser necesaria para resolver el problema? Si no, otros vuelven y solicitan toda la información. – priya

+1

¿Cómo se ve la instrucción de inserción? ¿Puedes obtenerlo del registro general de MySQL? –

Respuesta

1

¿Por qué tiene texto fuera de las comillas en el ejemplo - es decir, 'lol sí'

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

El mensaje anterior corresponde a este tweet - https://twitter.com/#!/Dorable_Dimples/status/ 154099896998309888 – priya

+0

Lo extraño es que vemos un recuadro cuadrado al final del mensaje en nuestro navegador y buscamos estos valores usando la API de twitter4j – priya

56

Es el personaje al final del tweet 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 al almacenar caracteres utf de 4 bytes en algunas versiones de MySQL. Al parecer, usted debe utilizar para representar utf8mb4 4 caracteres UTF byte, como el juego de caracteres UTF-8 normal sólo puede representar caracteres de hasta 3 bytes de longitud y por tanto no puede almacenar caracteres que están fuera de la Basic Multilingual Plane

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í How to insert utf-8 mb4 character(emoji in ios5) in mysql? incluyendo:

"También asegúrese de que su capa de aplicación establece el carácter de sus conexiones de base de datos se establece en utf8mb4 doble comprobar esto está sucediendo realmente - si estás. ejecutar una versión anterior de la biblioteca de cliente mysql de su framework elegido, puede que no se haya compilado con soporte utf8mb4 y no configurará el charset correctamente. De lo contrario, deberá actualizarlo o compilarlo usted mismo "

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

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

7

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. utilizar un varbinary o binario para almacenar la cadena tweet:

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

La ventaja es que usted no conseguirá ningún problema de conjunto de caracteres.

El inconveniente 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.

-1

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í

5

Tenía este problema exacto de resolver, cambiar la codificación predeterminada en el lado del servidor MySQL para utf8mb4 después de esta excelente guía:.. http://mathiasbynens.be/notes/mysql-utf8mb4

recuerde reiniciar su servicio mysqld después de hacer cambios al 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 el controlador mysql jdbc para jugar muy bien con la codificación de caracteres utf8mb4. Espero que esto ayude!

Cuestiones relacionadas