MySQL permet de configurer plusieurs aspects de la communication client-serveur (selon le 10.4 Jeux de caractères de connexion et classements documentaire) :
- Encodage source (c'est-à-dire client) :
character_set_client
- Encodage de la destination (c'est-à-dire du serveur) :
character_set_connection
- Données et métadonnées renvoyées :
character_set_results
Je suppose qu'il est supposé que l'encodage source, issu d'une technologie Microsoft, est UTF-16 Little Endian.
Comme pour les deux autres, le Connector/ Référence des options de chaîne de connexion NET la documentation indique :
La connexion à MySQL doit être informée que l'encodage cible est UTF-8 (ce que vos colonnes MySQL utilisent). MySQL suppose actuellement que vous envoyez des chaînes non Unicode, faisant en fait la même chose que la conversion en VARCHAR
dans SQL Server, en supposant que la page de code spécifiée par le classement par défaut de la base de données actuelle est 1252 (la page de code Windows 1252 est communément appelée "ANSI
", même si c'est techniquement nom inexact).
Ce qui suit montre le comportement dans SQL Server en ne préfixant pas la chaîne avec un "N" majuscule :
SELECT 'α'; -- Database's default Collation = Latin1_General_100_CI_AS_SC
-- a
SELECT 'α'; -- Database's default Collation = Hebrew_100_BIN2
-- ?
Essayez ce qui suit pour résoudre ce problème :
-
La première tentative devrait être d'ajouter ce qui suit à votre chaîne de connexion pour envoyer des données de caractères au format UTF-8 à MySQL (cela devrait simplement définir
character_set_connection
):CharSet=utf8;
Exemple de chaîne de connexion complète ici
-
La deuxième tentative doit consister à envoyer une commande SQL, lors de la connexion initiale, pour définir la variable au niveau de la session qui contrôle l'encodage de destination :
SET character_set_connection = utf8;
Pour plus d'informations, veuillez consulter les éléments suivants :
Selon la section "utf8 Collations" de cette page, il serait bien préférable d'utiliser utf8_unicode_ci
pour le Collationnement au lieu de utf8_general_ci
(pour être clair, cette recommandation n'a rien à voir avec le problème de conversion de caractères traité ici).
PS Cette question/réponse est accompagnée d'un Q &A sur DBA.StackExhange :