Quelques cas spéciaux où la détermination de la collation est difficile
<<<
Les collation doivent correspondre au bon jeu de caractères Un exemple de l'effet de collation
>>>

11.3 Déterminer le jeu de caractères et la collation par défaut
11 Jeux de caractères et Unicode
 Manuel de Référence MySQL 4.1 : Version Française

Jeu de caractères et collation serveur
Jeu de caractères et collation de base de données
Jeu de caractères de tables et collation
Jeu de caractères de colonne et collation
Exemples d'attribution de jeu de caractères et collation
Jeux de caractères et collations de connexion
Jeu de caractères et collation des chaînes littérales
Clause COLLATE dans différentes parties d'une requête SQL
COLLATE clause de précédence
Opérateur BINARY
Quelques cas spéciaux où la détermination de la collation est difficile
->Les collation doivent correspondre au bon jeu de caractères
Un exemple de l'effet de collation

11.3.12 Les collation doivent correspondre au bon jeu de caractères

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 ( UTF8 pour metadata ). 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 s utf8 :

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 .

<< Les collation doivent correspondre au bon jeu de caractères >>
Quelques cas spéciaux où la détermination de la collation est difficile Déterminer le jeu de caractères et la collation par défaut Un exemple de l'effet de collation