Incorrecte “chaîne de valeur” lorsque vous tentez d'insérer UTF-8 dans MySQL via JDBC?
C'est ainsi que ma connexion est fixé à:
Connection conn = DriverManager.getConnection(url + dbName + "?useUnicode=true&characterEncoding=utf-8", userName, password);
Et j'obtiens le message d'erreur suivant lorsque tyring pour ajouter une ligne à un tableau:
Incorrect string value: '\xF0\x90\x8D\x83\xF0\x90...' for column 'content' at row 1
Je suis l'insertion des milliers de dossiers, et j'ai toujours ce message d'erreur lorsque le texte contient des \xF0 (c'est à dire la chaîne incorrecte de la valeur commence toujours par \xF0).
De la colonne de classement est utf8_general_ci.
Quel pourrait être le problème?
- Que serait la LETTRE minuscule LATINE N AVEC un TILDE (ñ).
Vous devez vous connecter pour publier un commentaire.
MySQL
utf8
autorise uniquement les caractères Unicode qui peut être représenté avec 3 octets en UTF-8. Ici vous avez un personnage qui a besoin de 4 octets: \xF0\x90\x8D\x83 (U+10343 LETTRE GOTHIQUE SAUIL).Si vous avez MySQL 5.5 ou version ultérieure, vous pouvez changer la colonne de l'encodage à partir
utf8
àutf8mb4
. Ce codage permet de stocker des personnages qui occupent 4 octets en UTF-8.Vous pouvez également définir la propriété de serveur
character_set_server
àutf8mb4
dans le fichier de configuration de MySQL. Il semble que Connector/J par défaut est 3 octets Unicode autrement:utf8_general_ci
mais a été toujours obtenir une erreur mysql. Je suis heureux @Joni eu la réponse ci-dessus, ou sinon je n'aurais jamais deviné ce qui se passait.character_encoding_server
est nota MySQL valide config nom de la variable. J'ai essayé de mettrecharacter_set_server
àutf8mb4
au lieu de cela, en plus des colonnes, mais ça n'a rien changé.utf8mb3
utf
SET NAMES utf8mb4;
avant laLOAD DATA LOCAL INFILE
déclaration a été super utile pour moi. stackoverflow.com/a/42024406/470749Les chaînes qui contiennent
\xF0
sont tout simplement caractères codés comme plusieurs octets l'utilisation de l'UTF-8.Bien que votre classement est mis à utf8_general_ci, je soupçonne que le codage des caractères de la base de données, une table ou une même colonne peut être différent. Ils sont les paramètres indépendants. Essayez:
Substitut quel que soit votre type de données est de type VARCHAR(255)
file-encoding
paramètre spécifiant l'UTF-8, par exemplejava -Dfile.encoding=UTF-8
ou ajouter un interrupteur approprié dans votre Tomcat (etc.) fichier de configuration.Eu le même problème, à enregistrer les données avec
utf8mb4
doit s'assurer que:character_set_client, character_set_connection, character_set_results
sontutf8mb4
:character_set_client
etcharacter_set_connection
indiquer le jeu de caractères dans lequel les instructions sont envoyées par le client,character_set_results
indique le jeu de caractères dans lequel le serveur renvoie les résultats de la requête du client.Voir jeu de caractères de la connexion.
la table et de la colonne de codage est
utf8mb4
Pour JDBC, il y a deux solutions:
Solution 1 (besoin de redémarrer MySQL):
modifier
my.cnf
comme suit et redémarrer MySQL:cela peut assurez-vous que la base de données et
character_set_client, character_set_connection, character_set_results
sontutf8mb4
par défaut.redémarrer MySQL
de changer de table et de colonne de l'encodage
utf8mb4
ARRÊTER précisant
characterEncoding=UTF-8
etcharacterSetResults=UTF-8
dans le connecteur jdbc,cause cela va remplacercharacter_set_client
,character_set_connection
,character_set_results
àutf8
Solution de deux (n'avez pas besoin de redémarrer MySQL):
de changer de table et de colonne de l'encodage
utf8mb4
précisant
characterEncoding=UTF-8
dans le connecteur jdbc,provoquer le connecteur jdbc n'est pas de suportutf8mb4
.écrire votre sql de tresorerie comme ceci (il faut ajouter
allowMultiQueries=true
de connecteur jdbc):ce sera assurez-vous que chaque connexion au serveur,
character_set_client,character_set_connection,character_set_results
sontutf8mb4
.Voir aussi jeu de caractères de la connexion.
SELECT
requêtes, commeset names utf8mb4; select ... from ...
ne produira jamais unResultSet
et place le résultat dans unResultSet is from UPDATE. No Data.
erreur.default-character-set=utf8mb4
pour le client mysql fixe pour moi.character-set-server
est facultatif. Le moyen le plus rapide pour le tester:select CONVERT('' USING utf8mb4);
(éditer ~/.mon.cnf ou /etc/my.cnf sur le client mysql machine). Pour tester character_set_results (de serveur à client partie):select CONVERT(UNHEX('F09F9883') USING utf8mb4);
. "character-set-server" seulement définit le jeu de caractères par défaut appliqués lors de la création de la base de données de commandes à exécuter. Source: "indiquer le jeu de caractères et la collation de la base de données par défaut" dev.mysql.com/doc/refman/8.0/en/charset-connection.htmlJ'ai voulu combiner les deux posts pour faire une réponse complète, car il semble que quelques étapes.
/etc/mysql/my.cnf
ou/etc/mysql/mysql.conf.d/mysqld.cnf
À nouveau à partir de conseils au-dessus de toutes les connexions jdbc avait
characterEncoding=UTF-8
etcharacterSetResults=UTF-8
retiréAvec cet ensemble
-Dfile.encoding=UTF-8
semble pas faire de différence.Je ne pouvais pas encore écrire du texte international en db se même l'échec comme ci-dessus
Maintenant en utilisant cette comment-convertir-un-ensemble-mysql-base de données-characterset-et-classement-à-utf-8
Mise à jour de tous vos db à utiliser
utf8mb4
Exécuter cette requête que vous donne ce qui doit être sonnée
Copier coller de sortie dans l'éditeur de remplacer toutes les | avec rien de nouveau en mysql lorsqu'il est connecté à corriger db.
C'est tout ce qui devait être fait et tout semble fonctionner pour moi. Pas la -
Dfile.encoding=UTF-8
n'est pas activé et il semble fonctionner comme prévuE2A Encore d'avoir un problème ?
Je suis effectivement en production, donc il s'avère que vous avez besoin de vérifier ce qui a été fait par ci-dessus, car elle peut ne fonctionne pas, voici la raison et de la fixer dans ce scénario:
Vous pouvez voir certains sont encore en latin
tenter de mettre à jour manuellement le dossier:
Donc, nous allons le réduire:
En bref, j'ai dû réduire la taille de ce champ afin d'obtenir la mise à jour fonctionne.
Maintenant quand je le lance:
Tout cela fonctionne
ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4;
curieusement quand j'ai couru ce la dernière fois que tous les champs n'avait plus un jeu de caractères défini. si le mot de passe à partir de ci-dessus est devenupassword
varchar(255) not NULL, (rien à propos de l'encodage). Cela signifie que la dernière commande doit simplement avoir fait mysql recherche de la véritable définition de la table a été et parce que maintenant la table par défaut, ce champs n'en avez plus besoin - je présume qu'ils sont restés avec le jeu de caractères tout simplement parce que pendant le vidage de l'ensemble des mises à jour de table, il ne pouvait pas le mettre à jour et d'où il a été laissé dans cet étatDans mon cas, j'ai essayé tout ce qui précède, rien n'a fonctionné. Je suis assez sûr, ma base de données se présente comme suit.
donc, je regarde le jeu de caractères de la colonne de chaque table
Il s'avère que la colonne jeu de caractères latin. C'est pourquoi, je ne peux pas insérer Chinois dans la base de données.
Qui pourraient vous aider. 🙂
il suffit de ne
En supposant que vous utilisez phpmyadmin pour résoudre cette erreur, suivez ces étapes:
latin1_swedish_ci
(ou ce que c'est) pourutf8_general_ci
Surtout due à certains caractères unicode. Dans mon cas, c'était le symbole de la devise Roupie.
Rapidement résoudre ce problème, j'ai eu à la place du personnage qui provoque cette erreur. J'ai copier collé le tout le texte dans un éditeur de texte comme vi et a remplacé le troublant personnage avec un texte un.
J'ai eu le même problème dans mon rails de projet:
Solution 1: avant d'enregistrer dans la base de données convertit une chaîne base64 par
Base64.encode64(subject)
et après l'extraction de db utiliser
Base64.decode64(subject)
Solution 2:
L'étape 1:
Changer le jeu de caractères et collation) pour la colonne objet par
Étape 2: Dans la base de données.yml utilisation
J'ai eu ce problème avec mon JEU de l'application Java. C'est ma trace de la pile pour que l'exception:
J'ai essayé d'enregistrer un enregistrement à l'aide d'io.Ebean. Je l'ai fixée par la reprise de la création de ma base de données avec utf8mb4 classement, et appliqué jouer évolution de re créer toutes les tables de sorte que toutes les tables doivent être recréé avec de l'utf-8 classement.
Je vous ne souhaitez appliquer les modifications uniquement pour un champ, vous pouvez essayer d'arranger le champ
ma solution est de changer le type de colonne de type varchar(255) blob
Vous devez définir utf8mb4 dans les méta html et aussi dans votre serveur alter table et set de classement pour utf8mb4
Si vous créez une nouvelle table MySQL, vous pouvez spécifier le jeu de caractères de toutes les colonnes lors de la création, et qui a résolu le problème pour moi.
Vous pouvez lire plus de détails: https://dev.mysql.com/doc/refman/8.0/en/charset-column.html