MySQL抛出错误的string值错误

我试图将下面的tweet存储到长文本列/ utf8 charset / MySQL 5.5中。 数据库与MyISAM存储上。

我们也尝试了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) 

推特结束时的angular色导致了问题。

它看起来像一个“表情符号”字符又名日本笑脸,但它不显示在我的Chrome或Safari。

在某些版本的MySQL中存在已知的存储4字节utf字符的问题。 显然你必须使用utf8mb4来表示4个字节的UTF字符,因为普通的utf8字符集只能表示长达3个字节的字符,所以不能存储基本多语言平面之外的字符

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

这对我来说是新闻,因为它基本上意味着在MySQL中的utf8数据types是不是真正适合utf8。

这里有如何处理这个问题的build议如何在MySQL中插入utf-8 mb4字符(在ios5中的表情符号)? 包含:

“还要确保你的应用程序层把它的数据库连接的字符集设置为utf8mb4。仔细检查这是真正发生的 – 如果你正在运行你select的框架的mysql客户端库的一个较老的版本,它可能没有被编译支持utf8mb4它不会正确设置字符集,如果没有,你可能需要更新它或自己编译它“

如果您使用的是Connector / J,则需要在连接configuration中设置character_set_server = utf8mb4。

所有你的字符集应该是utf8mb4,你可能已经尝试过,但目前没有设置。

我喜欢Danask57的回答 – 这是正确的,是正确的。 (我自己投了票)

但是,另一个快速而肮脏的解决scheme是更改模式。 使用varbinary或binary来存储推文string:

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

好处是你不会遇到任何字符集问题。

缺点是您的string比较和sorting将会丢失,并且您将无法对列进行全文索引。

只是一个build议,但这不是“正确”的答案,只是一个快速和肮脏的解决scheme,让事情工作。

我有这个确切的问题。 为了解决这个问题,把下面这个优秀的指南改成mysql服务器端的默认编码为utf8mb4: http ://mathiasbynens.be/notes/mysql-utf8mb4。

请记住,在更改configuration文件后重新启动您的mysqld服务。

对我而言,我还需要将mysql jdbc驱动程序更新到版本5.1.18(从版本5.1.6开始)。 我已经阅读过某处,您必须至less使用5.1.14版本的mysql jdbc驱动程序才能很好地使用utf8mb4字符编码。 希望这可以帮助!

为什么你的例子中的引号之外的文本 – 即“大声笑是的”

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

问题是在string“@”。 引擎数据库解释为特殊字符。 我做:

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

ressed。 #foreveralone?“哈哈是的