2012-01-03 42 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字符编码一起玩,希望对你有所帮助!

相关问题