MySQL выдает ошибку неверного строкового значения

Я пытаюсь сохранить следующий твит в длинную текстовую колонку/кодировку 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)

person priya    schedule 03.01.2012    source источник
comment
Не могли бы вы свести свой вопрос к соответствующей информации, пожалуйста?   -  person juergen d    schedule 03.01.2012
comment
Я предполагаю, что предоставил информацию, имеющую отношение к проблеме, не уверен, что я могу уменьшить. Не разумно ли предоставить информацию, которая может быть необходима для решения проблемы. Если нет, другие возвращаются и запрашивают всю информацию.   -  person priya    schedule 03.01.2012
comment
Как выглядит оператор вставки? Можете ли вы получить его из общего журнала MySQL?   -  person Andreas Wederbrand    schedule 03.01.2012
comment
Я все еще пытаюсь получить журналы mysql, но не могу настроить экземпляр RDS для создания журналов сервера. Скоро опубликую.   -  person priya    schedule 05.01.2012
comment
stackoverflow.com/questions/2692188 /   -  person Manjula    schedule 06.01.2012


Ответы (5)


Проблема заключается в персонаже в конце твита.

Это похоже на символ «эмодзи», также известный как японский смайлик, но он не отображается ни в Chrome, ни в Safari.

Известны проблемы с хранением 4-байтовых символов utf в некоторых версиях MySQL. По-видимому, вы должны использовать utf8mb4 для представления 4-байтовых символов UTF, поскольку обычный набор символов utf8 может представлять только символы длиной до 3 байтов и поэтому не может хранить символы, которые находятся за пределами Базовая многоязычная плоскость

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

Для меня это новость, поскольку в основном это означает, что тип данных utf8 в MySQL на самом деле не является правильным utf8.

Здесь есть предложения о том, как с этим справиться вставить символ utf-8 mb4 (emoji в ios5) в mysql? в том числе:

«Также убедитесь, что уровень вашего приложения устанавливает набор символов для подключения к базе данных на utf8mb4. Дважды проверьте, действительно ли это происходит — если вы используете более старую версию клиентской библиотеки mysql выбранной вами платформы, возможно, она не была скомпилирована с поддержкой utf8mb4. и он не установит кодировку должным образом. Если нет, вам, возможно, придется обновить ее или скомпилировать самостоятельно"

Если вы используете Connector/J, вам нужно установить character_set_server=utf8mb4 в конфигурации соединения.

Все ваши наборы символов должны быть utf8mb4, которые вы, возможно, пробовали, но в настоящее время не установлены.

person Danack    schedule 07.01.2012

Мне нравится ответ Danask57 - это правильный и «правильный» способ сделать это. (Я сам проголосовал за это)

Однако есть еще одно быстрое и грязное решение — изменить схему. используйте varbinary или двоичный файл для хранения строки твита:

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

Плюс в том, что у вас не будет проблем с набором символов.

Недостатком является то, что ваше сравнение строк и сортировка будут потеряны, и вы не сможете выполнить полнотекстовый индекс столбца.

Просто предложение, но это не «правильный» ответ, а просто быстрое и грязное решение, которое заставляет все работать.

person FlipMcF    schedule 11.01.2012

У меня была именно эта проблема. Чтобы решить эту проблему, измените кодировку по умолчанию на стороне сервера mysql на utf8mb4, следуя этому превосходному руководству: http://mathiasbynens.be/notes/mysql-utf8mb4 .

Не забудьте перезапустить службу mysqld после внесения изменений в файл конфигурации.

Для меня также нужно было обновить драйвер mysql jdbc до версии 5.1.18 (с версии 5.1.6). Я где-то читал, что вы должны использовать как минимум версию 5.1.14, чтобы драйвер mysql jdbc хорошо работал с кодировкой символов utf8mb4. Надеюсь это поможет!

person mancini0    schedule 07.06.2014

Почему в вашем примере у вас есть текст вне кавычек - например, «смеется, да»

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

проблема в строке "@". база данных движка интерпретируется как специальный символ. я делаю:

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

одет. #навсегда?» лол да

person chenio    schedule 11.01.2012