Souvenez-vous que chaque jeu de caractères a une ou plusieurs
collations, et que chaque collation est associée à un et un
seul un jeu de caractères. Par conséquent, la commande
suivante engendre un message erreur car la collation
latin2_bin
n'est pas autorisée avec le jeu
de caractères latin1
:
mysql> SELECT _latin1 'x' COLLATE latin2_bin;
ERROR 1251: COLLATION 'latin2_bin' is not valid
for CHARACTER SET 'latin1'
Dans certaines cas, les expressions qui fonctionnaient avant MySQL 4.1 échoueront en MySQL 4.1 si vous ne prenez pas en compte les collations et jeux de caractères. Par exemple, avant la version 4.1, cette commande fonctionnait comme :
mysql> SELECT SUBSTRING_INDEX(USER(),'@',1);
+-------------------------------+
| SUBSTRING_INDEX(USER(),'@',1) |
+-------------------------------+
| root |
+-------------------------------+
Après une mise à jour en MySQL 4.1, la commande échoue :
mysql> SELECT SUBSTRING_INDEX(USER(),'@',1);
ERROR 1267 (HY000): Illegal mix of collations
(utf8_general_ci,IMPLICIT) and (latin1_swedish_ci,COERCIBLE)
for operation 'substr_index'
La raison à cela est que les noms d'utilisateurs sont stockées
en UTF8 (see Section 10.6, « UTF8 pour les meta-données »). Par
conséquent, la fonction USER()
et la chaîne
littérale '@'
ont des jeux de caractères
différents et des collations différentes :
mysql> SELECT COLLATION(USER()), COLLATION('@');
+-------------------+-------------------+
| COLLATION(USER()) | COLLATION('@') |
+-------------------+-------------------+
| utf8_general_ci | latin1_swedish_ci |
+-------------------+-------------------+
Un moyen pour corriger cela est de dire à MySQL qu'il doit
interpréter les chaînes littérales avec le jeu de caractères
sutf8
:
mysql> SELECT SUBSTRING_INDEX(USER(),_utf8'@',1);
+------------------------------------+
| SUBSTRING_INDEX(USER(),_utf8'@',1) |
+------------------------------------+
| root |
+------------------------------------+
Un autre moyen est de changer le jeu de caractères et la
collation de la connexion en utf8
. Vous
pouvez aussi utiliser la commande SET NAMES
'utf8'
ou les variables système
character_set_connection
et
collation_connection
.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.