2012-01-03 4 views
35

Sto tentando di memorizzare il seguente tweet in una colonna longtext/utf8 charset/MySQL 5.5. database con archivio MyISAM attivo.MySQL genera errori di stringa errati

Abbiamo anche provato i set di caratteri utf8mb4, utf16, utf32 ma non siamo riusciti a superare questo 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

Potresti ridurre il tuo qu stato delle informazioni pertinenti, per favore? –

+4

Immagino di aver fornito informazioni pertinenti al problema, non so cosa posso ridurre. Non è prudente fornire informazioni che potrebbero essere necessarie per risolvere il problema. Altrimenti, altri ritornano e chiedono l'intera informazione. – priya

+1

Come appare l'istruzione di inserimento? Puoi ottenerlo dal registro mysql generale? –

risposta

1

Perché hai testo al di fuori delle citazioni nel vostro esempio - vale a dire 'lol sì'

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

Il messaggio precedente corrisponde a questo tweet - https://twitter.com/#!/Dorable_Dimples/status/ 154099896998309888 – priya

+0

La parte strana è che vediamo una casella quadrata alla fine del messaggio nel nostro browser e recuperiamo questi valori utilizzando l'API twitter4j – priya

56

E 'il carattere alla fine del tweet che sta causando il problema.

Sembra un personaggio "emoji" noto come faccina giapponese, ma non viene visualizzato per me in Chrome o Safari.

Ci sono problemi noti che memorizzano i caratteri 4byte utf in alcune versioni di MySQL. A quanto pare è necessario utilizzare utf8mb4 per rappresentare 4 caratteri UTF byte, come il normale set di caratteri utf8 può rappresentare solo i caratteri fino a 3 byte di lunghezza e quindi non in grado di memorizzare carattere che sono al di fuori del Basic Multilingual Plane

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

Il che è una novità per me in quanto significa sostanzialmente che il tipo di dati utf8 in MySQL non è proprio corretto utf8.

ci sono suggerimenti su come gestire questo qui How to insert utf-8 mb4 character(emoji in ios5) in mysql? tra cui:

"Assicurarsi inoltre che il livello di applicazione set di caratteri sue connessioni al database impostato su utf8mb4 doppio controllare questo sta realmente accadendo - se siete. eseguendo una versione precedente della libreria client mysql del framework scelto, potrebbe non essere stata compilata con il supporto di utf8mb4 e non imposterà correttamente il set di caratteri. In caso contrario, potrebbe essere necessario aggiornarlo o compilarlo da soli "

Se stai usando Connector/J devi impostare character_set_server = utf8mb4 nella configurazione di connessione.

Tutti i set di caratteri devono essere utf8mb4, che probabilmente hai provato ma non sono attualmente impostati.

7

Mi piace la risposta di Danask57: è corretto e il modo "giusto" per farlo. (Ho votato io stesso)

Tuttavia, un'altra soluzione rapida e sporca consiste nel modificare lo schema. utilizzare un varbinary o binario per memorizzare la stringa Tweet:

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

Il vantaggio è che non sarà possibile ottenere alcun problema di set di caratteri.

Lo svantaggio è che il confronto e l'ordinamento delle stringhe andranno persi e non sarà possibile indicizzare completamente la colonna.

Solo un suggerimento, ma questa non è la risposta "giusta", solo una soluzione rapida e sporca che fa funzionare le cose.

-1

il problema è nella stringa "@". il database del motore interpreta come un carattere speciale. faccio:

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

ressed. ? #foreveralone" lol sì

5

ho avuto questo problema esatto da risolvere, modificare la codifica di default sul lato server MySQL per utf8mb4 seguendo questa guida eccellente:.. http://mathiasbynens.be/notes/mysql-utf8mb4

Ricordati di riavviare il servizio mysqld dopo aver apportato modifiche al file di configurazione

Per me, avevo anche bisogno di aggiornare il driver jdbc mysql alla versione 5.1.18 (dalla versione 5.1.6). Ho letto da qualche parte che è necessario utilizzare almeno la versione 5.1.14 per mysql jdbc driver per giocare bene con la codifica dei caratteri utf8mb4 Spero che questo aiuti!