118 votes

java.sql.SQLException : Valeur de chaîne incorrecte : \xF0\x9F\x91\xBD\xF0\x9F... '

J'ai la valeur de chaîne suivante : "walmart obama"

J'utilise MySQL et Java.

J'obtiens l'exception suivante : `java.sql.SQLException : Valeur de chaîne incorrecte : ' \xF0\x9F\x91\xBD\xF0\x9F... '

Voici la variable que j'essaie d'insérer :

var1 varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL`

Mon code Java qui essaie d'insérer "walmart obama" est un preparedStatement. J'utilise donc la fonction setString() méthode.

Il semble que le problème soit l'encodage des valeurs . Comment puis-je le résoudre ? Auparavant, j'utilisais Derby SQL et les valeurs se retrouvaient juste sous la forme de deux sqaures (je pense que c'est la représentation du caractère null).

Toute aide est grandement appréciée !

154voto

Esailija Points 74052

Ce que vous avez est EXTRATERRESTRIAL ALIEN (U+1F47D) et BROKEN HEART (U+1F494) qui ne sont pas dans le plan de base du multilinguisme. Ils ne peuvent même pas être représentés en java comme un seul caractère, "

19voto

jsh Points 1067

Bizarrement, j'ai trouvé que REMOVING &characterEncoding=UTF-8 de la JDBC url a fait l'affaire pour moi avec des problèmes similaires.

Basé sur mes propriétés,

jdbc_url=jdbc:mysql://localhost:3306/dbName?useUnicode=true

Je pense que cela confirme ce que @Esailija a dit plus haut, c'est-à-dire que mon MySQL, qui est effectivement 5.5, est en train de trouver sa propre saveur préférée d'encodage UTF-8.

(Remarque, je spécifie également le paramètre InputStream Je suis en train de lire à partir de UTF-8 dans le code java, ce qui ne fait probablement pas de mal)...

17voto

rilaby Points 397

En résumé, pour sauvegarder les symboles qui nécessitent 4 octets, vous devez mettre à jour le jeu de caractères et la collation de l'interface utilisateur. utf8mb4 :

  1. table/colonne de la base de données : alter table <some_table> convert to character set utf8mb4 collate utf8mb4_unicode_ci
  2. connexion au serveur de la base de données ( voir )

Dans mon environnement de développement, pour le numéro 2, je préfère définir les paramètres en ligne de commande lors du démarrage du serveur : mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci


Au fait, faites attention à Comportement du connecteur/J con SET NAMES 'utf8mb4' :

N'émettez pas les noms des jeux de caractères avec Connector/J, car le pilote ne détectera pas que le jeu de caractères a changé et continuera à utiliser le jeu de caractères détecté lors de la configuration initiale de la connexion.

Et évitez de mettre characterEncoding dans l'url de connexion car il remplacera l'encodage du serveur configuré :

Pour remplacer le codage détecté automatiquement du côté client, utilisez la propriété characterEncoding dans l'URL utilisée pour se connecter au serveur.

7voto

test Points 119

Comment j'ai résolu mon problème.

J'avais

?useUnicode=true&amp;characterEncoding=UTF-8

Dans mon url de connexion jdbc hibernate et j'ai changé le type de données de la chaîne en longtext dans la base de données, qui était varchar avant.

4voto

JHS Points 4317

Ajoutez la ligne useUnicode=true&amp;characterEncoding=UTF-8 à votre url jdbc.

Dans votre cas, les données ne sont pas envoyées à l'aide de la fonction UTF-8 l'encodage.

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