MySQL抛出不正确的字符串值错误
我试图将以下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)
为什么你的文字在你的榜样引号之外 - 即“笑是”
tweet="@Dorable_Dimples: Okay enough of those #IfYouWereMines I'm getting depressed. #foreveralone ?" lol yes
这是一笔是造成问题的鸣叫结束的字符。
它看起来像一个'表情符号'字符又名日本笑脸,但它不显示在我的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,你可能已经尝试过但目前没有设置。
我喜欢Danask57的回答 - 这是正确的方法。 (我自己投了票)
但是,另一个快速和肮脏的解决方案是改变架构。用VARBINARY或二进制存储鸣叫字符串:
http://dev.mysql.com/doc/refman/5.0/en/binary-varbinary.html
的好处是,你不会得到任何字符集问题。
缺点是您的字符串比较和排序将会丢失,并且您将无法对列进行全文索引。
只是一个建议,但这不是'正确'的答案,只是一个快速和肮脏的解决方案,让事情工作。
问题出在字符串“@”。 引擎数据库解释像一个特殊字符。 我这样做:
tweet="Dorable_Dimples: Okay enough of those #IfYouWereMines I'm getting dep
ressed。 ?#foreveralone”笑是
我有这个确切的问题解决,更改MySQL服务器端的默认编码utf8mb4这个优秀的指南如下:。http://mathiasbynens.be/notes/mysql-utf8mb4
记住更改后重新启动mysqld服务到配置文件
对我来说,我还需要将mysql jdbc驱动程序更新到版本5.1.18(从版本5.1.6开始)我已经阅读过某些地方必须至少使用版本5.1.14 mysql jdbc驱动可以很好的与utf8mb4字符编码一起玩,希望对你有所帮助!
你能减少你的qu请注意相关信息? – 2012-01-03 09:05:51
我想已经提供了与问题相关的信息,不知道我能减少什么。提供可能有必要的信息来解决问题不是明智之举吗?如果没有,其他人会回来询问整个信息。 – priya 2012-01-03 09:07:32
插入语句如何查看?你能从通用的mysql日志中得到它吗? – 2012-01-03 10:07:58