Dans la grande majorité des requêtes, la collation utilisée
par MySQL pour résoudre une comparaison est évidente. Par
exemple, dans les cas suivants, il devrait être clair que la
collation sera "la collation de colonne de la colonne
x
'' :
SELECT x FROM T ORDER BY x; SELECT x FROM T WHERE x = x; SELECT DISTINCT x FROM T;
Cependant, quand des opérandes multiples sont, en jeu il peut y avoir des ambiguïtés. Par exemple :
SELECT x FROM T WHERE x = 'Y';
Cette requête devrait elle utiliser la collation de la colonne
x
, ou celle de la chaîne littérale
'Y'
?
Le standard SQL résout de telles questions en utilisant ce qui
portait le nom de règles coercitives
(``coercibility
''). L'essence de la question
est : puisque x
et 'Y'
ont tous deux des collations différentes, laquelle a priorité?
C'est une question complexe, mais ces règles devraient
résoudre la plupart des situations :
Une clause explicite COLLATE
a pour
priorité 4.
Une concaténation de deux chaînes avec des collations différentes à pour priorité 3.
La collation d'une colonne a priorité 2.
La collation d'une chaîne littérale a pour priorité 1.
Ces règles résolvent les ambiguités de la fa¸on suivante :
Utiliser la collation qui a la précédence la plus élevée.
Si les deux opérandes ont une collation de même priorité, alors il y a erreur si les collations ne sont pas les mêmes.
Exemples :
column1 = 'A' |
Utilise la collation de la colonne column1
|
column1 = 'A' COLLATE x |
Utilise la collation de 'A'
|
column1 COLLATE x = 'A' COLLATE y |
Erreur |
La fonction COERCIBILITY()
peut être
utilisée pour déterminer la coercibilité d'une chaîne :
mysql>SELECT COERCIBILITY('A' COLLATE latin1_swedish_ci);
-> 0 mysql>SELECT COERCIBILITY('A');
-> 3
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.