Voici comment ma connexion est établie:
Connection conn = DriverManager.getConnection(url + dbName + "?useUnicode=true&characterEncoding=utf-8", userName, password);
Et j'obtiens l'erreur suivante lorsque je tente d'ajouter une ligne à une table:
Incorrect string value: '\xF0\x90\x8D\x83\xF0\x90...' for column 'content' at row 1
J'insère des milliers d'enregistrements et j'obtiens toujours cette erreur lorsque le texte contient \ xF0 (c'est-à-dire que la valeur de chaîne incorrecte commence toujours par \ xF0).
Le classement de la colonne est utf8_general_ci.
Quel pourrait être le problème?
Réponses:
MySQL
utf8
n'autorise que les caractères Unicode qui peuvent être représentés avec 3 octets en UTF-8. Ici, vous avez un caractère qui a besoin de 4 octets: \ xF0 \ x90 \ x8D \ x83 ( U + 10343 GOTHIC LETTER SAUIL ).Si vous avez MySQL 5.5 ou une version ultérieure, vous pouvez changer l'encodage des colonnes de
utf8
àutf8mb4
. Ce codage permet le stockage de caractères qui occupent 4 octets en UTF-8.Vous pouvez également définir la propriété du serveur
character_set_server
pourutf8mb4
dans le fichier de configuration de MySQL. Il semble que le connecteur / J par défaut soit Unicode 3 octets sinon :la source
character_encoding_server
n'est pas un nom de variable de configuration MySQL valide. J'ai essayé de définircharacter_set_server
à lautf8mb4
place, en plus des colonnes individuelles, mais cela n'a rien changé.Les chaînes qui contiennent
\xF0
sont simplement des caractères codés sur plusieurs octets à l' aide de UTF-8.Bien que votre classement soit défini sur utf8_general_ci, je soupçonne que le codage des caractères de la base de données, de la table ou même de la colonne peut être différent. Ce sont des paramètres indépendants . Essayer:
Remplacez VARCHAR (255) par votre type de données réel
la source
file-encoding
paramètre spécifiant UTF-8, par exemplejava -Dfile.encoding=UTF-8
ou ajoutez un commutateur approprié dans votre fichier de configuration Tomcat (etc.).Vous avez le même problème, pour enregistrer les données avec les
utf8mb4
besoins pour vous assurer:character_set_client, character_set_connection, character_set_results
sontutf8mb4
:character_set_client
etcharacter_set_connection
indiquent 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 au client.Voir charset-connection .
le codage de table et de colonne est
utf8mb4
Pour JDBC, il existe deux solutions:
Solution 1 (besoin de redémarrer MySQL):
modifiez
my.cnf
comme suit et redémarrez MySQL:cela peut garantir que la base de données et
character_set_client, character_set_connection, character_set_results
sontutf8mb4
par défaut.redémarrer MySQL
changer le codage de table et de colonne en
utf8mb4
ARRÊT spécification
characterEncoding=UTF-8
etcharacterSetResults=UTF-8
dans le connecteur jdbc, faire ceci surpasseracharacter_set_client
,character_set_connection
,character_set_results
àutf8
Deuxième solution (pas besoin de redémarrer MySQL):
changer le codage de table et de colonne en
utf8mb4
spécifiant
characterEncoding=UTF-8
dans le connecteur jdbc, car le connecteur jdbc ne prend pas en chargeutf8mb4
.écrivez votre déclaration sql comme ceci (besoin d'ajouter
allowMultiQueries=true
au connecteur jdbc):cela garantira que chaque connexion au serveur l'
character_set_client,character_set_connection,character_set_results
estutf8mb4
.Voir aussi charset-connection .
la source
SELECT
requêtes, carset names utf8mb4; select ... from ...
elle ne produira jamais unResultSet
et entraînera uneResultSet is from UPDATE. No Data.
erreur.Je voulais combiner quelques articles pour répondre pleinement à cela, car cela semble être quelques étapes.
/etc/mysql/my.cnf
ou/etc/mysql/mysql.conf.d/mysqld.cnf
Encore une fois à partir des conseils avant tout, les connexions jdbc avaient
characterEncoding=UTF-8
etcharacterSetResults=UTF-8
retirés de leurAvec cet ensemble
-Dfile.encoding=UTF-8
semblait ne faire aucune différence.Je ne pouvais toujours pas écrire de texte international en db obtenant le même échec que ci-dessus
Maintenant, en utilisant ce comment-convertir-un-ensemble-de-caractères-de-base-de-données-mysql-et-collation-en-utf-8
Mettez à jour tous vos db pour les utiliser
utf8mb4
Exécutez cette requête qui vous donne ce qui doit être appelé
Copier coller la sortie dans l'éditeur remplacer tout | sans rien poster dans mysql lorsqu'il est connecté pour corriger la base de données.
C'est tout ce qui devait être fait et tout semble fonctionner pour moi. Pas le -
Dfile.encoding=UTF-8
n'est pas activé et il semble fonctionner comme prévuE2A Vous rencontrez toujours un problème? Je suis certainement en production, il s'avère que vous devez vérifier ce qui a été fait ci-dessus, car cela ne fonctionne parfois pas, voici la raison et la solution dans ce scénario:
Vous pouvez voir que certains sont encore en train d'essayer de mettre à jour manuellement l'enregistrement:
Alors, rétrécissons-le:
En bref, j'ai dû réduire la taille de ce champ pour que la mise à jour fonctionne.
Maintenant, quand je cours:
Tout fonctionne
la source
ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4;
étrangement quand j'ai exécuté cela la dernière fois, tous les champs n'avaient plus de jeu de caractères défini. donc le mot de passe ci-dessus est devenupassword
varchar (255) NOT NULL, (rien sur l'encodage). Cela signifie que la dernière commande doit simplement avoir recherché mysql quelle était la définition réelle de la table et parce que maintenant la table était par défaut, les champs n'en ont plus besoin - je suppose qu'ils sont restés avec le jeu de caractères simplement parce que pendant le vidage des mises à jour de la table entière il ne pouvait pas le mettre à jour et il a donc été laissé dans cet étatDans mon cas, j'ai tout essayé ci-dessus, rien n'a fonctionné. Je suis sûr que ma base de données ressemble à ci-dessous.
donc, je recherche le jeu de caractères de la colonne dans chaque table
Il s'avère que le jeu de caractères de la colonne est latin. C'est pourquoi, je ne peux pas insérer de chinois dans la base de données.
Cela pourrait vous aider. :)
la source
J'ai eu le même problème dans mon projet de rails:
Solution 1: avant d'enregistrer en db, convertissez la chaîne en base64 par
Base64.encode64(subject)
et après la récupération à partir de l'utilisation de la base de donnéesBase64.decode64(subject)
Solution 2:
Étape 1: modifiez le jeu de caractères (et le classement) pour la colonne sujet par
Étape 2: dans le fichier database.yml, utilisez
la source
fais juste
la source
En supposant que vous utilisez phpmyadmin pour résoudre cette erreur, procédez comme suit:
latin1_swedish_ci
(ou quoi que ce soit) enutf8_general_ci
la source
Cela est principalement dû à certains caractères unicode. Dans mon cas, c'était le symbole de la monnaie Roupie.
Pour résoudre ce problème rapidement, j'ai dû repérer le personnage à l'origine de cette erreur. Je copie le texte entier collé dans un éditeur de texte comme vi et remplace le caractère troublant par un texte.
la source
J'ai eu ce problème avec mon application Java PLAY. Voici ma trace de pile pour cette exception:
J'essayais de sauvegarder un enregistrement en utilisant io.Ebean. Je l'ai corrigé en recréant ma base de données avec le classement utf8mb4, et appliqué l'évolution du jeu pour recréer toutes les tables afin que toutes les tables soient recréées avec le classement utf-8.
la source
Si vous ne souhaitez appliquer la modification qu'à un seul champ, vous pouvez essayer de sérialiser le champ
la source
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 cela 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
la source
ce n'est pas la solution de recommandation .. Mais vaut la peine d'être partagée. Depuis mon projet, mettre à niveau le SGBD de l'ancien Mysql vers le plus récent (8). Mais je ne peux pas changer la structure de la table, seule la configuration du SGBD (mysql). La solution pour le serveur mysql.
test sous Windows mysql 8.0.15 sur mysql config recherche de
le décommenter. Ou dans mon cas, il suffit de taper / ajouter
pourquoi pas la solution recommandée. car si vous utilisez latin1 (mon cas) .. l'insertion des données réussie mais pas le contenu (mysql ne répond pas avec erreur !!). par exemple, vous tapez des informations comme celle-ci
ça sauve
ok .. pour mon problème .. je peux changer le champ en UTF8 .. Mais il y a un petit problème .. voir la réponse ci-dessus à propos d'une autre solution a échoué car le mot n'est pas inséré car contient plus de 2 octets (cmiiw) .. ce solution faire vos données d'insertion devenir boîte. Le raisonnable est d'utiliser blob .. et vous pouvez sauter ma réponse.
Un autre test lié à cela était .. en utilisant utf8_encode sur votre code avant d'enregistrer. J'utilise sur latin1 et ce fut un succès (je n'utilise pas le mode sql )! même réponse que ci-dessus en utilisant base64_encode .
Ma suggestion pour analyser les exigences de votre table et essayer de passer d'un autre format à UTF8
la source
ma solution est de changer le type de colonne de varchar (255) en blob
la source
Vous devez définir utf8mb4 en méta html et également dans votre serveur alter tabel et définir le classement sur utf8mb4
la source
Astuce: sur AWS RDS, vous avez besoin d'un nouveau groupe de paramètres pour votre base de données MySQL avec les paramètres (au lieu de modifier un my.cnf)
Remarque: character_set_system reste "utf8"
Ces commandes SQL NE FONCTIONNENT PAS DE MANIÈRE PERMANENTE - uniquement dans une session:
la source
J'ai également dû supprimer et recréer toutes les procédures stockées de la base de données (et les fonctions aussi) afin qu'elles s'exécutent dans le nouveau jeu de caractères d'utf8mb4.
Courir:
… Pour voir quelles procédures n'ont pas été mises à jour avec les nouvelles valeurs du serveur character_set_client, collation_connection et Database Collation.
la source