2012-01-03 31 views
35

Próbuję zapisać następujący tweet w długiej kolumnie/utf8 charset/MySQL 5.5. baza danych z magazynem MyISAM na.MySQL zgłasza Niepoprawny błąd wartości ciągu znaków

Próbowaliśmy również zestawów znaków utf8mb4, utf16, utf32, ale nie można pominąć tego problemu.

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

Czy możesz zredukować swój qu estion do odpowiednich informacji, proszę? –

+4

Zgaduję, że dostarczyłem informacje, które są istotne dla problemu, nie wiem, co mogę zmniejszyć. Czy nie jest rozsądne dostarczanie informacji, które mogą być konieczne do rozwiązania problemu. Jeśli nie, inni wracają i proszą o całą informację. – priya

+1

Jak wygląda instrukcja wstawiania? Czy możesz go pobrać z ogólnego dziennika mysql? –

Odpowiedz

1

Dlaczego masz tekst poza cytatami w swoim przykładzie - czyli „lol tak”

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

Powyższy komunikat odpowiada temu tweetowi - https://twitter.com/#!/Dorable_Dimples/status/ 154099896998309888 – priya

+0

Dziwne jest to, że widzimy kwadratową ramkę na końcu wiadomości w naszej przeglądarce i pobieramy te wartości za pomocą API twitter4j – priya

56

Jest to znak na końcu tweet, który jest przyczyną problemu.

Wygląda jak "emoji", czyli japońska buźka, ale nie wyświetla się w Chrome ani w Safari.

Znane są problemy z przechowywaniem 4-bajtowych znaków utf w niektórych wersjach MySQL. Widocznie trzeba użyć utf8mb4 reprezentować 4 bajty znaków UTF, jak normalny zestaw znaków utf8 może reprezentować tylko znaki do 3 bajtów długości i tak nie można zapisać znaku, które są poza Basic Multilingual Plane

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

Co jest dla mnie nowością, ponieważ oznacza to, że typ danych utf8 w MySQL nie jest właściwie utf8.

Istnieją sugestie, w jaki sposób sobie z tym poradzić tutaj How to insert utf-8 mb4 character(emoji in ios5) in mysql? tym:

„Również upewnić się, że warstwa aplikacji określa charakter jego połączeń bazy danych ustawioną na utf8mb4 dwukrotnie sprawdzić to się rzeczywiście dzieje - jeśli jesteś. działająca starsza wersja biblioteki mysql wybranego przez ciebie systemu, może nie została skompilowana z obsługą utf8mb4 i nie ustawi poprawnie zestawu znaków. Jeśli nie, możesz go zaktualizować lub skompilować samodzielnie "

Jeśli używasz Connector/J, musisz ustawić character_set_server = utf8mb4 w konfiguracji połączenia.

Wszystkie zestawy znaków powinny być utf8mb4, które można wypróbować, ale nie są aktualnie ustawione.

7

Podoba mi się odpowiedź Danask57 - jest poprawna i "właściwy" sposób na zrobienie tego. (Sam głosowałem)

Jednak innym szybkim i brudnym rozwiązaniem jest zmiana schematu. użyć varbinary lub binarny zapisać ciąg tweet:

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

Plusem jest to, że nie będzie żadnych problemów z zestawu znaków.

Wadą jest to, że porównywanie i sortowanie ciągów zostanie utracone, a nie będzie można pełnotekstowego indeksować kolumny.

To tylko sugestia, ale nie jest to "właściwa" odpowiedź, tylko szybkie i brudne rozwiązanie, które działa.

-1

Problem jest w ciągu znaków "@". baza danych silnika interprete jak znak specjalny. do:

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

przywrócone. ? #foreveralone”lol tak

5

miałem dokładnie ten problem do rozwiązania, zmienić domyślne kodowanie po stronie serwera mysql do utf8mb4 po tym doskonałym przewodnikiem:.. http://mathiasbynens.be/notes/mysql-utf8mb4

Pamiętaj, aby ponownie uruchomić usługę mysqld po wprowadzeniu zmian do pliku konfiguracyjnego:

Dla mnie, również musiałem zaktualizować sterownik mysql jdbc do wersji 5.1.18 (od wersji 5.1.6). Czytałem gdzieś, że musisz użyć przynajmniej wersji 5.1.14 dla Sterownik mysql jdbc ładnie odtwarza kodowanie znaków utf8mb4. Nadzieję, że to pomoże!