MySQL抛出不正确的字符串值错误
Posted
技术标签:
【中文标题】MySQL抛出不正确的字符串值错误【英文标题】:MySQL throws Incorrect string value error 【发布时间】:2012-02-01 08:27:37 【问题描述】:我正在尝试将以下推文存储到长文本列/utf8 字符集/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)
【问题讨论】:
能否将您的问题简化为相关信息? 我想已经提供了与问题相关的信息,不知道我可以减少什么。提供解决问题可能需要的信息不是谨慎的做法吗?如果没有,其他人会回来询问全部信息。 插入语句看起来如何?能从一般的mysql日志中得到吗? 我仍在尝试获取 mysql 日志,但无法配置 RDS 实例以生成服务器日志。很快就会发布。 ***.com/questions/2692188/… 【参考方案1】:我有这个确切的问题。要解决此问题,请按照以下优秀指南将 mysql 服务器端的默认编码更改为 utf8mb4:http://mathiasbynens.be/notes/mysql-utf8mb4。
修改配置文件后记得重启mysqld服务。
对我来说,我还需要将 mysql jdbc 驱动程序更新到版本 5.1.18(从版本 5.1.6)。我在某处读到,您必须至少使用 5.1.14 版本的 mysql jdbc 驱动程序才能很好地使用 utf8mb4 字符编码。希望这会有所帮助!
【讨论】:
【参考方案2】:问题出在字符串“@”中。 引擎数据库解释为特殊字符。 我愿意:
tweet="Dorable_Dimples: Okay enough of those #IfYouWereMines I'm getting dep
压力很大。 #foreveralone 吗?”哈哈是的
【讨论】:
【参考方案3】:我喜欢 Danask57 的回答 - 这是正确的,也是“正确”的做法。 (我自己投了赞成票)
但是,另一种快速而简单的解决方案是更改架构。使用 varbinary 或 binary 来存储推文字符串:
http://dev.mysql.com/doc/refman/5.0/en/binary-varbinary.html
好处是你不会遇到任何字符集问题。
缺点是您的字符串比较和排序将丢失,并且您将无法对列进行全文索引。
只是一个建议,但这不是“正确”的答案,只是一个快速而肮脏的解决方案,可以让事情正常进行。
【讨论】:
【参考方案4】:这是导致问题的推文末尾的字符。
它看起来像一个“表情符号”字符,也就是日本笑脸,但它在 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,它不会正确设置字符集。如果没有,您可能需要更新它或自己编译它"
如果您使用的是 Connector/J,则需要在连接配置中设置 character_set_server=utf8mb4。
您的所有字符集都应该是 utf8mb4,您可能已经尝试过,但目前尚未设置。
【讨论】:
【参考方案5】:为什么你的例子中有引号之外的文字 - 即'lol yes'
tweet="@Dorable_Dimples: Okay enough of those #IfYouWereMines I'm getting depressed. #foreveralone ?" lol yes
【讨论】:
以上消息对应这条推文-twitter.com/#!/Dorable_Dimples/status/154099896998309888 奇怪的是,我们在浏览器中看到消息末尾的方框,我们使用 twitter4j API 获取这些值以上是关于MySQL抛出不正确的字符串值错误的主要内容,如果未能解决你的问题,请参考以下文章
在 MySQL 中存储 emoji 得到不正确的字符串值错误
将字符串时间戳解析为即时抛出不受支持的字段:InstantSeconds
QueryPerformanceCounter 抛出不正确的数字
SQL Server - MySQL 迁移错误:不正确的字符串值:'\xF4\x80\x82\x83...'