Après avoir remarqué qu'une application avait tendance à rejeter les e-mails aléatoires en raison d'erreurs de valeur de chaîne incorrecte, je suis allé bien et j'ai changé de nombreuses colonnes de texte pour utiliser le utf8
jeu de caractères de colonne et la colonne par défaut collate ( utf8_general_ci
) afin de les accepter. Cela a corrigé la plupart des erreurs et empêché l'application de recevoir des erreurs SQL lorsqu'elle touchait également des e-mails non latins.
Malgré cela, certains e-mails provoquent toujours des erreurs de valeur de chaîne incorrectes par le programme: (Incorrect string value: '\xE4\xC5\xCC\xC9\xD3\xD8...' for column 'contents' at row 1)
La colonne de contenu est une MEDIUMTEXT
datatybe qui utilise le utf8
jeu de caractères de colonne et l' utf8_general_ci
assemblage de colonnes. Il n'y a pas d'indicateur que je peux basculer dans cette colonne.
En gardant à l'esprit que je ne veux pas toucher ni même regarder le code source de l'application sauf si c'est absolument nécessaire:
- Quelle est la cause de cette erreur? (oui, je sais que les e-mails sont pleins d'ordures aléatoires, mais je pensais que utf8 serait assez permissif)
- Comment puis-je y remédier?
- Quels sont les effets probables d'un tel correctif?
Une chose que j'ai envisagée était de passer à un varchar utf8 ([un grand nombre]) avec le drapeau binaire activé, mais je ne connais pas assez bien MySQL et je n'ai aucune idée si une telle correction a du sens.
Réponses:
"\xE4\xC5\xCC\xC9\xD3\xD8"
n'est pas valide UTF-8. Testé avec Python:Si vous cherchez un moyen d'éviter les erreurs de décodage dans la base de données, le codage cp1252 (alias "Windows-1252" ou "Windows Western European") est le codage le plus permissif qui soit - chaque valeur d'octet est un point de code valide.
Bien sûr, il ne comprendra plus le véritable UTF-8, ni aucun autre encodage non cp1252, mais il semble que vous ne soyez pas trop préoccupé par cela?
la source
café
, cela va mal interpréter cela commecafé
. Il ne plantera pas, mais il comprendra mal les caractères à bits élevés.Je ne suggérerais pas la réponse de Richies, car vous bousillez les données dans la base de données. Vous ne résoudriez pas votre problème mais essayez de le «cacher» et de ne pas pouvoir effectuer les opérations essentielles de base de données avec les données de merde.
Si vous rencontrez cette erreur, les données que vous envoyez ne sont pas encodées en UTF-8 ou votre connexion n'est pas en UTF-8. Tout d' abord, vérifiez que la source de données (fichier, ...) vraiment est UTF-8.
Ensuite, vérifiez votre connexion à la base de données, vous devez le faire après la connexion:
Ensuite, vérifiez que les tables dans lesquelles les données sont stockées ont le jeu de caractères utf8:
Enfin, vérifiez les paramètres de votre base de données:
Si la source, le transport et la destination sont UTF-8, votre problème a disparu;)
la source
SET CHARACTER SET utf8
(pas CHARACTER_SET)Les types utf-8 de MySQL ne sont pas réellement utf-8 appropriés - il n'utilise que jusqu'à trois octets par caractère et ne supporte que le plan multilingue de base (c'est-à-dire pas d'Emoji, pas de plan astral, etc.).
Si vous avez besoin de stocker des valeurs à partir de plans Unicode supérieurs, vous avez besoin des encodages utf8mb4 .
la source
La table et les champs ont le mauvais encodage; cependant, vous pouvez les convertir en UTF-8.
la source
J'ai résolu ce problème aujourd'hui en modifiant la colonne en type «LONGBLOB» qui stocke des octets bruts au lieu de caractères UTF-8.
Le seul inconvénient est que vous devez vous occuper de l'encodage vous-même. Si un client de votre application utilise le codage UTF-8 et un autre utilise le CP1252, vos e-mails peuvent être envoyés avec des caractères incorrects. Pour éviter cela, utilisez toujours le même encodage (par exemple UTF-8) dans toutes vos applications .
Reportez-vous à cette page http://dev.mysql.com/doc/refman/5.0/en/blob.html pour plus de détails sur les différences entre TEXT / LONGTEXT et BLOB / LONGBLOB. Il existe également de nombreux autres arguments sur le Web traitant de ces deux.
la source
Vérifiez d'abord si votre default_character_set_name est utf8.
Si le résultat n'est pas utf8, vous devez convertir votre base de données. Au début, vous devez enregistrer un vidage.
Pour modifier le codage du jeu de caractères en UTF-8 pour toutes les tables de la base de données spécifiée, tapez la commande suivante sur la ligne de commande. Remplacez DBNAME par le nom de la base de données:
Pour changer le codage du jeu de caractères en UTF-8 pour la base de données elle-même, tapez la commande suivante à l' invite mysql >. Remplacez DBNAME par le nom de la base de données:
Vous pouvez maintenant réessayer d'écrire le caractère utf8 dans votre base de données. Cette solution m'aide lorsque j'essaye de télécharger 200000 lignes de fichier csv dans ma base de données.
la source
En général, cela se produit lorsque vous insérez des chaînes dans des colonnes avec un encodage / classement incompatible.
J'ai eu cette erreur lorsque j'avais des TRIGGER, qui héritent du classement du serveur pour une raison quelconque. Et la valeur par défaut de mysql est (au moins sur Ubuntu) latin-1 avec classement suédois. Même si j'avais la base de données et toutes les tables définies sur UTF-8, je n'avais pas encore défini
my.cnf
:/etc/mysql/my.cnf:
Et cela doit lister tous les déclencheurs avec utf8- *:
Et certaines des variables répertoriées par ceci devraient également avoir utf-8- * (pas d'encodage latin-1 ou autre):
la source
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.
la source
J'ai eu une erreur similaire (
Incorrect string value: '\xD0\xBE\xDO\xB2. ...' for 'content' at row 1
). J'ai essayé de changer le jeu de caractères de la colonneutf8mb4
et après cela, l'erreur est devenue'Data too long for column 'content' at row 1'
.Il s'est avéré que mysql me montre une erreur erronée. J'ai retourné le jeu de caractères de la colonne
utf8
et changé le type de colonne enMEDIUMTEXT
. Après cela, l'erreur a disparu.J'espère que cela aide quelqu'un.
Au fait MariaDB dans le même cas (j'ai testé le même INSERT là-bas) vient de couper un texte sans erreur.
la source
Cette erreur signifie que soit vous avez la chaîne avec un codage incorrect (par exemple, vous essayez d'entrer une chaîne codée ISO-8859-1 dans une colonne codée UTF-8), soit la colonne ne prend pas en charge les données que vous essayez d'entrer.
En pratique, ce dernier problème est causé par l'implémentation de MySQL UTF-8 qui ne prend en charge que les caractères UNICODE qui nécessitent 1 à 3 octets lorsqu'ils sont représentés en UTF-8. Voir "Valeur de chaîne incorrecte" lorsque vous essayez d'insérer UTF-8 dans MySQL via JDBC? pour plus de détails.
la source
La solution pour moi lorsque je rencontre cette valeur de chaîne incorrecte: '\ xF8' pour l'erreur de colonne à l'aide de scriptcase était de m'assurer que ma base de données est configurée pour utf8 general ci, de même que mes classements de champs. Ensuite, quand je fais mon importation de données d'un fichier csv, je charge le csv dans UE Studio puis je l'enregistre au format utf8 et voilà! Cela fonctionne comme un charme, 29000 enregistrements là-dedans aucune erreur. Auparavant, j'essayais d'importer un fichier csv créé par Excel.
la source
J'ai essayé toutes les solutions ci-dessus (qui apportent toutes des points valables), mais rien ne fonctionnait pour moi.
Jusqu'à ce que je trouve que mes mappages de champs de table MySQL en C # utilisaient un type incorrect: MySqlDbType.Blob . Je l'ai changé en MySqlDbType.Text et maintenant je peux écrire tous les symboles UTF8 que je veux!
ps Le champ de la table MySQL est du type "LongText". Cependant, lorsque j'ai généré automatiquement les mappages de champs à l'aide du logiciel MyGeneration, il définit automatiquement le type de champ comme MySqlDbType.Blob en C #.
Fait intéressant, j'utilise le type MySqlDbType.Blob avec des caractères UTF8 depuis de nombreux mois sans problème, jusqu'au jour où j'ai essayé d'écrire une chaîne avec des caractères spécifiques.
J'espère que cela aide quelqu'un qui a du mal à trouver une raison de l'erreur.
la source
J'ai ajouté un binaire avant le nom de la colonne et résolu l'erreur de jeu de caractères.
insérer dans les valeurs tableA (binaire stringcolname1);
la source
Salut, j'ai également eu cette erreur lorsque j'utilise mes bases de données en ligne à partir du serveur godaddy, je pense qu'il a la version mysql de 5.1 ou plus. mais quand je le fais à partir de mon serveur localhost (version 5.7), tout allait bien après avoir créé la table à partir du serveur local et copié sur le serveur en ligne à l'aide de mysql yog, je pense que le problème vient du jeu de caractères
Capture d'écran ici
la source
Pour corriger cette erreur, j'ai mis à niveau ma base de données MySQL vers utf8mb4 qui prend en charge le jeu de caractères Unicode complet en suivant ce tutoriel détaillé . Je suggère de le parcourir attentivement, car il y a pas mal de pièges (par exemple, les clés d'index peuvent devenir trop volumineuses en raison des nouveaux encodages après quoi vous devez modifier les types de champs).
la source
Il y a de bonnes réponses ici. J'ajoute simplement le mien car j'ai rencontré la même erreur, mais il s'est avéré être un problème complètement différent. (Peut-être en surface la même chose, mais une cause fondamentale différente.)
Pour moi, l'erreur s'est produite pour le champ suivant:
Cela finit par être stocké dans la base de données en tant que sérialisation binaire de la
URI
classe. Cela n'a soulevé aucun drapeau avec les tests unitaires (en utilisant H2) ou les tests CI / intégration (en utilisant MariaDB4j ), cela a explosé dans notre configuration de production. (Cependant, une fois le problème compris, il était assez facile de voir la mauvaise valeur dans l'instance MariaDB4j; cela n'a tout simplement pas fait sauter le test.) La solution était de créer un mappeur de type personnalisé:Utilisé comme suit:
En ce qui concerne Hibernate, il semble qu'il dispose d'un tas de mappeurs de types fournis , y compris pour
java.net.URL
, mais pas pourjava.net.URI
(ce dont nous avions besoin ici).la source
Dans mon cas, ce problème a été résolu en changeant l'encodage de la colonne Mysql en 'binaire' (le type de données sera automatiquement changé en VARBINARY). Je ne pourrai probablement pas filtrer ou rechercher avec cette colonne, mais je n'en ai pas besoin.
la source
Si vous traitez la valeur avec une fonction de chaîne avant de l'enregistrer, assurez-vous que la fonction peut correctement gérer les caractères multi-octets. Les fonctions de chaîne qui ne peuvent pas faire cela et qui, par exemple, tentent de tronquer peuvent diviser l'un des caractères multi-octets uniques au milieu, ce qui peut provoquer de telles situations d'erreur de chaîne.
En PHP par exemple, vous devrez passer de
substr
àmb_substr
.la source
Dans mon cas, j'ai d'abord rencontré un '???' dans mon site Web, puis je vérifie le jeu de caractères de Mysql qui est maintenant latin, donc je le change en utf-8, puis je redémarre mon projet, puis j'ai eu la même erreur avec vous, puis j'ai trouvé que j'oublie de changer le jeu de caractères de la base de données et changer en utf-8, boum, ça a marché.
la source
J'ai essayé presque toutes les étapes mentionnées ici. Aucun n'a fonctionné. Téléchargé mariadb. Ça a marché. Je sais que ce n'est pas une solution, mais cela pourrait aider quelqu'un à identifier rapidement le problème ou à proposer une solution temporaire.
la source
Dans mon cas,
Incorrect string value: '\xCC\x88'...
le problème était qu'un o-umlaut était dans son état décomposé. Cette question-réponse m'a aidé à comprendre la différence entreo¨
etö
. En PHP, le correctif pour moi était d'utiliser la bibliothèque PHP Normalizer . Par exemple,Normalizer::normalize('o¨', Normalizer::FORM_C)
.la source
1 - Vous devez déclarer dans votre connexion la propriété d'encondant UTF8. http://php.net/manual/en/mysqli.set-charset.php .
2 - Si vous utilisez la ligne de commande mysql pour exécuter un script, vous devez utiliser l'indicateur, comme:
Cmd: C:\wamp64\bin\mysql\mysql5.7.14\bin\mysql.exe -h localhost -u root -P 3306 --default-character-set=utf8 omega_empresa_parametros_336 < C:\wamp64\www\PontoEletronico\PE10002Corporacao\BancoDeDadosModelo\omega_empresa_parametros.sql
la source