2012-01-03 54 views
35

我試圖將以下tweet存儲到longtext列/ utf8字符集/ MySQL 5.5中。帶有MyISAM存儲的數據庫。MySQL拋出不正確的字符串值錯誤

我們也嘗試過utf8mb4,utf16,utf32的字符集,但無法超越這個問題。

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

你能減少你的qu請注意相關信息? – 2012-01-03 09:05:51

+4

我想已經提供了與問題相關的信息,不知道我能減少什麼。提供可能有必要的信息來解決問題不是明智之舉嗎?如果沒有,其他人會回來詢問整個信息。 – priya 2012-01-03 09:07:32

+1

插入語句如何查看?你能從通用的mysql日誌中得到它嗎? – 2012-01-03 10:07:58

回答

1

爲什麼你的文字在你的榜樣引號之外 - 即「笑是」

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

上面的消息對應於這條推文 - https://twitter.com/#!/Dorable_Dimples/status/ 154099896998309888 – priya 2012-01-06 12:00:01

+0

奇怪的是,我們在瀏覽器的消息末尾看到一個方框,我們使用twitter4j API獲取這些值 – priya 2012-01-06 12:01:02

56

這是一筆是造成問題的鳴叫結束的字符。

它看起來像一個'表情符號'字符又名日本笑臉,但它不顯示在我的Chrome或Safari。

在某些版本的MySQL中存在已知的存儲4字節utf字符的問題。顯然,必須使用utf8mb4以表示4個字節UTF字符,因爲正常UTF8字符集只能代表字符長度最多爲3個字節,所以不能存儲字符它們是Basic Multilingual Plane

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

以外這對我來說是新聞,因爲它基本上意味着MySQL中的utf8數據類型不適合utf8。

有如何處理這這裏 How to insert utf-8 mb4 character(emoji in ios5) in mysql?建議包括:

「另外,請確保您的應用程序層設置其數據庫連接字符集utf8mb4仔細檢查,這是實際發生的事情 - 如果你。運行你選擇的框架的mysql客戶端庫的舊版本,它可能沒有被編譯爲utf8mb4支持,它不會正確設置字符集,如果不是,你可能需要自己更新它或者編譯它「

If您正在使用連接器/ J,您需要在連接配置中設置character_set_server = utf8mb4。

你所有的字符集應該是utf8mb4,你可能已經嘗試過但目前沒有設置。

7

我喜歡Danask57的回答 - 這是正確的方法。 (我自己投了票)

但是,另一個快速和骯髒的解決方案是改變架構。用VARBINARY或二進制存儲鳴叫字符串:

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

的好處是,你不會得到任何字符集問題。

缺點是您的字符串比較和排序將會丟失,並且您將無法對列進行全文索引。

只是一個建議,但這不是'正確'的答案,只是一個快速和骯髒的解決方案,讓事情工作。

-1

問題出在字符串「@」。 引擎數據庫解釋像一個特殊字符。 我這樣做:

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

ressed。 ?#foreveralone」笑是

5

我有這個確切的問題解決,更改MySQL服務器端的默認編碼utf8mb4這個優秀的指南如下:。http://mathiasbynens.be/notes/mysql-utf8mb4

記住更改後重新啓動mysqld服務到配置文件

對我來說,我還需要將mysql jdbc驅動程序更新到版本5.1.18(從版本5.1.6開始)我已經閱讀過某些地方必須至少使用版本5.1.14 mysql jdbc驅動可以很好的與utf8mb4字符編碼一起玩,希望對你有所幫助!

相關問題