web-dev-qa-db-fra.com

MySQL Chaîne de caractères UTF8 non valide lors de l'importation d'une table csv

Je souhaite importer un fichier .csv dans la base de données MySQL en:

load data local infile 'C:\\Users\\t_lichtenberger\\Desktop\\tblEnvironmentLog.csv'
into table tblenvironmentlog
character set utf8
fields terminated by ';'
lines terminated by '\n'
ignore 1 lines;

Le fichier .csv ressemble à: enter image description here

Mais j'obtiens l'erreur suivante et je ne peux pas expliquer pourquoi:

Error Code: 1300. Invalid utf8 character string: 'M'

Aucune suggestion?

12
user7335295

Découvrez les paramètres de l'exportation . Recherchez "UTF-8".

Ceci suggère que le "texte tronqué" est dû au fait que les données ne sont pas codées en utf8mb4. En dehors de MySQL, "recherchez" UTF-8 "(à l'intérieur, MySQL, utf8 et utf8mb4 fonctionnent également bien pour tous les jeux de caractères européens, donc le ü ne devrait pas être un problème.

S'il a été exporté en tant que "cp1252" (ou l'un des nombreux codages), l'octet de ü ne serait pas valide pour utf8mb4, ce qui entraînerait une troncature.

Si cette analyse est correcte, il existe deux solutions:

Plan A: exporter en tant que UTF-8.

Plan B: importation en tant que latin1. (Vous n'avez pas besoin de modifier la définition de la colonne/table, juste le LOAD DATA.)

11
Rick James

Rien d'autre que j'ai essayé n'a fonctionné pour moi, y compris la garantie que mon .csv a été enregistré avec l'encodage UTF-8.

Cela a fonctionné:

Lors de l'utilisation de LOAD DATA LOCAL INFILE, ensemble CHARACTER SET latin1 au lieu de CHARACTER SET utf8mb4 comme indiqué dans https://dzone.com/articles/mysql-57-utf8mb4-and-the-load-data-infile

Voici un exemple complet qui a fonctionné pour moi:

TRUNCATE Homestead_daily.answers;
SET FOREIGN_KEY_CHECKS = 0; 
TRUNCATE Homestead_daily.questions;
SET FOREIGN_KEY_CHECKS = 1; 
LOAD DATA LOCAL INFILE 'C:/Users/me/Desktop/questions.csv' INTO TABLE Homestead_daily.questions
CHARACTER SET latin1
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
(type, question, created_at, updated_at);
SELECT * FROM Homestead_daily.questions;
8
Ryan

Ouvrez simplement le fichier csv dans votre éditeur de texte (comme Notepad ++)

et changez le fichier Encoding en UTF-8

puis importez votre fichier csv

4
Ammar Bozorgvar

Il se plaint de 'M' mais je pense que c'est dans München et le caractère problématique est le suivant, le tréma 'ü'.

Une façon simple de tester serait d'essayer de charger un fichier avec seulement les 2 premières lignes et de voir si cela fonctionne. Ajoutez ensuite la 3e ligne, réessayez et voyez si cela échoue.

Si vous ne pouvez pas ou ne voulez pas remplacer ces caractères spéciaux dans vos données, vous devrez alors commencer à enquêter sur les jeux de caractères configurés dans votre fichier CSV, base de données, table, colonnes, outils, etc.

Utilisez-vous MySQL 5.7 ou supérieur? Alors quelque chose de simple à essayer serait de passer à character set utf8mb4 dans votre load data commande.

Voir Comment MySQL 5.7 gère 'utf8mb4' et le fichier de données de chargement pour un problème similaire.

Regarde aussi:

importez les noms géographiques allCountries.txt dans MySQL 5.7 en utilisant LOAD INFILE - ERROR 1300 (HY000)

Problème avec les caractères utf8; ce que je vois n'est pas ce que j'ai stocké

"Valeur de chaîne incorrecte" lorsque vous essayez d'insérer UTF-8 dans MySQL via JDBC?

2
davmos