36 votes

MySQL jette Incorrecte de la chaîne de valeur de l'erreur

Je suis en train de stocker le tweet suivant dans un longtext colonne / charset utf8 / MySQL 5.5. base de données avec MyISAM stockage sur.

Nous avons également tenté de utf8mb4, utf16, utf32 les jeux de caractères, mais sont incapables de sortir de cette question.

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)

57voto

Danack Points 8764

C'est le caractère à la fin du tweet qui cause le problème.

Il ressemble à un "emoji" caractère aka japonais smiley mais il n'affiche pas pour moi dans google Chrome ou Safari.

Il y a des problèmes connus stockage 4byte utf caractères dans certaines versions de MySQL. Apparemment, vous devez utiliser utf8mb4 pour représenter 4 octets UTF caractères, comme la normale utf8 jeu de caractères ne peut représenter les caractères jusqu'à 3 octets de longueur et ne peut donc pas stocker les caractères qui sont en dehors du Plan Multilingue de Base

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

Qui sont des nouvelles de moi, car il signifie que l'utf8 type de données dans MySQL n'est pas vraiment bon utf8.

Il y a des suggestions sur la façon de gérer cela ici Comment insérer utf-8 mb4 caractère(emoji dans ios5) dans mysql? y compris:

"Assurez-vous également que votre application couche définit ses connexions de base de données' jeu de caractères à utf8mb4. Double-vérifier ce qui se passe réellement – si vous utilisez une ancienne version de votre choix cadre de la bibliothèque cliente mysql, il peut ne pas avoir été compilé avec utf8mb4 de soutien et de ne pas définir le jeu de caractères correctement. Si non, vous devrez mettre à jour ou de le compiler vous-même"

Si vous utilisez le Connecteur/J, vous devez définir le character_set_server=utf8mb4 dans la connexion config.

Tous vos jeux de caractères doivent être utf8mb4, qui vous a peut-être essayé, mais ne sont pas actuellement défini.

8voto

FlipMcF Points 3577

J'aime Danask57 de réponse - c'est exact, et la "bonne" façon de le faire. (J'ai jusqu'voté moi-même)

Cependant, un autre quick-and-dirty solution est de modifier le schéma. utiliser un varbinary ou binaire pour stocker le tweet de la chaîne:

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

L'avantage est que vous n'aurez pas de jeu de caractères problèmes.

L'inconvénient est que votre chaîne de comparaison et de tri sera perdu, et vous ne serez pas en mesure d'index de texte intégral de la colonne.

Juste une suggestion, mais ce n'est pas la "bonne" réponse, juste un rapide et sale solution qui obtient des choses à travailler.

5voto

mancini0 Points 31

J'ai eu exactement ce problème. Pour résoudre, de changer l'encodage par défaut sur le serveur mysql côté de utf8mb4 suite de cet excellent guide: http://mathiasbynens.be/notes/mysql-utf8mb4 .

N'oubliez pas de redémarrer votre serveur mysqld service après avoir modifié le fichier de configuration.

Pour moi, j'ai aussi besoin de mettre à jour le pilote jdbc mysql version 5.1.18 (à partir de la version 5.1.6). J'ai lu quelque part que vous devez utiliser au moins la version 5.1.14 pour le pilote jdbc mysql jouer gentiment avec utf8mb4 de codage de caractères. Espérons que cette aide!

1voto

Adrian Cornish Points 8651

Pourquoi avez-vous le texte en dehors des citations dans votre exemple - ie 'lol oui"

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

-1voto

chenio Points 359

le problème est dans la chaîne de caractères "@". le moteur de base de données interpréter comme un caractère spécial. je fais:

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

ressed. #foreveralone ?" lol oui

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X