13. Interclassements (collations)
Un interclassement (collation) fixe la manière dont deux textes se comparent : égalité, ordre, GROUP BY, DISTINCT, clés PRIMARY / UNIQUE, jointures, LIKE, partitions et plein texte. MIRAJ en propose cinq, choisis par colonne, par table ou par expression, avec les règles de la référence. Tout texte est rangé en UTF-8 (utf8mb4).
13.1 Les interclassements#
| Interclassement | Noms SQL acceptés | Comportement |
|---|---|---|
| général (par défaut) | utf8mb4_general_ci, utf8mb3_general_ci (utf8_general_ci), latin1_swedish_ci, latin1_general_ci | un poids de 16 bits par caractère ; casse et accents ignorés ('Crème' = 'creme'), ß = s (mais ≠ ss), æ, œ, ø, ł gardent leur propre poids ; tout caractère hors BMP pèse U+FFFD ('😀' = '😁') |
| Unicode | utf8mb4_unicode_ci, utf8mb3_unicode_ci (utf8_unicode_ci) | table UCA 4.0.0 relevée sur la référence, niveau primaire seul : casse et accents ignorés, expansions ('ß' = 'ss', 'œ' = 'oe', 'fi' = 'fi', 'Ⅳ' = 'iv'), marques combinantes et caractères de contrôle ignorés ('e' + U+0301 = 'e'), æ reste une lettre propre ('æ' ≠ 'ae') ; ordre UCA (ponctuation < chiffres < lettres : '_' < 'a') ; idéogrammes et caractères absents de la table : poids implicites ; tout caractère hors BMP a un même poids ('😀' = '😁') |
| Unicode 5.2 | utf8mb4_unicode_520_ci, utf8mb3_unicode_520_ci (utf8_unicode_520_ci) | table UCA 5.2.0 relevée sur la référence pour tout Unicode : mêmes règles, poids propres hors BMP ('😀' ≠ '😁'), espace de poids 020A |
| Unicode 14 | utf8mb4_uca1400_ai_ci, utf8mb3_uca1400_ai_ci | table UCA 14.0.0 relevée sur la référence pour tout Unicode, insensible aux accents et à la casse : 'æ' = 'ae', 'ø' = 'o', 'ł' = 'l', poids propres hors BMP, et contractions (939 suites de deux ou trois caractères pesées comme un tout : И + brève = Й, L· = l, voyelles antéposées thaïes et laotiennes : 'เก' pèse ก puis เ) |
| binaire | utf8mb4_bin, utf8mb3_bin (utf8_bin), latin1_bin | comparaison par point de code : casse et accents distingués ('A1' ≠ 'a1', 'é' ≠ 'e'), 'B' < 'a' |
SELECT 'ß' = 'ss' COLLATE utf8mb4_general_ci AS general,
'ß' = 'ss' COLLATE utf8mb4_unicode_ci AS unicode,
'😀' = '😁' COLLATE utf8mb4_unicode_520_ci AS unicode_520,
'æ' = 'ae' COLLATE utf8mb4_uca1400_ai_ci AS uca1400,
'é' = 'e' COLLATE utf8mb4_bin AS bin;+---------+---------+-------------+---------+-----+
| general | unicode | unicode_520 | uca1400 | bin |
+---------+---------+-------------+---------+-----+
| 0 | 1 | 0 | 1 | 0 |
+---------+---------+-------------+---------+-----+Tous sont PAD SPACE : les espaces finaux (U+0020 seulement) sont ignorés par =, l'ordre, GROUP BY, DISTINCT, les clés et les jointures ('a' = 'a ' vaut 1, même en binaire ; une tabulation finale compte). LIKE ne complète jamais par des espaces ('a ' LIKE 'a' est faux).
Les alias utf8_… sont lus utf8mb3_…. CHARACTER SET latin1 est accepté pour une colonne mais le texte reste rangé en utf8mb4. Le type binaire (BINARY, VARBINARY, BLOB, CAST(… AS BINARY)) se compare toujours octet par octet, sans PAD.
Une colonne JSON est un LONGTEXT en utf8mb4_bin muni de la contrainte implicite CHECK (json_valid(col)) : deux documents qui ne diffèrent que par la casse sont différents, et JSON_UNQUOTE(JSON_EXTRACT(doc, '$.a')) = 'x' ne trouve pas "X". SHOW CREATE TABLE l'écrit sous cette forme :
`j` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid(`j`))13.2 Choisir l'interclassement#
Colonne et table#
CREATE TABLE liasse (
code VARCHAR(10) COLLATE utf8mb4_bin PRIMARY KEY, -- 'A1' et 'a1' sont deux codes
nom VARCHAR(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
notes TEXT -- défaut de la table
) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;[CHARACTER SET jeu] COLLATE nomaprès le type d'une colonne texte (CHAR,VARCHAR,*TEXT,ENUM,SET) ;CHARACTER SET jeuseul donne l'interclassement par défaut du jeu, l'interclassement général.- L'attribut
BINARYd'une colonne texte (VARCHAR(10) BINARY) vautCOLLATE utf8mb4_bin;BINARY COLLATEd'un autre nom : erreur 1302. [DEFAULT] CHARSET = jeu,[DEFAULT] COLLATE = nomen option de table : défaut des colonnes texte écrites sans interclassement.- Exemple, avec les lignes
('A1', 'Straße')et('a1', 'Dupont'):WHERE code = 'a1'ne rend quea1,WHERE nom = 'strasse'rendA1, etSHOW CREATE TABLE liasseécrit`code` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULLet`nom` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL;SHOW FULL COLUMNS FROM liassemontreutf8mb4_bin,utf8mb4_unicode_cietutf8mb4_general_cidans la colonneCollation. Passer ensuitecodeenutf8mb4_general_cirendDuplicate entry 'a1' for key 'PRIMARY'(1062). CREATE TABLE … LIKErecopie colonnes et défaut ;CREATE TABLE … AS SELECTet les colonnes de vue prennent l'interclassement de la colonne source ou de l'expression (CONCAT(col_bin, 'x')reste binaire).
Base#
CREATE DATABASE compta CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
SHOW CREATE DATABASE compta;+----------+-----------------------------------------------------------------------------------------------+
| Database | Create Database |
+----------+-----------------------------------------------------------------------------------------------+
| compta | CREATE DATABASE `compta` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */ |
+----------+-----------------------------------------------------------------------------------------------+USE compta;
CREATE TABLE t (n VARCHAR(10));
-- SHOW CREATE TABLE t : … ) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
ALTER DATABASE compta COLLATE utf8mb4_bin; -- tables créées ensuite seulement
CREATE TABLE t2 (n VARCHAR(10));
-- SHOW CREATE TABLE t2 : … ) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_binCREATE DATABASE … [DEFAULT] [CHARACTER SET jeu] [DEFAULT] COLLATE nomfixe l'interclassement par défaut de la base : une table créée ensuite sansCOLLATE=le prend, ainsi que ses colonnes texte écrites sans interclassement (une table temporaire aussi).CHARACTER SET utf8mb4seul donne l'interclassement général.ALTER {DATABASE | SCHEMA} [nom] [DEFAULT] [CHARACTER SET jeu] [DEFAULT] COLLATE nomle change pour les tables créées ensuite ; les tables existantes gardent le leur. Sans nom : la base courante (1046 sans base courante ; une base inconnue rend l'erreur 1,Can't create/write to file './inconnue/db.opt').COMMENTest accepté et ignoré ;UPGRADE DATA DIRECTORY NAME: 1235.- Le défaut est gardé avec la base (fichier
options.mrode son répertoire, absent pour l'interclassement général), repris par les sauvegardes et, en édition Cluster, par les secondaires.
ALTER TABLE#
MODIFY/CHANGE/ADDd'une colonne :COLLATEécrit, sinon le défaut de la table ;RENAME COLUMNgarde l'interclassement.[DEFAULT] COLLATE = nomchange le défaut de la table sans toucher aux colonnes existantes ;[DEFAULT] CHARSET = jeuseul le remet à l'interclassement par défaut du jeu (général pourutf8mb4,utf8mb3etlatin1;CHARSET binaryest sans effet). Seules (avecCOMMENTouRENAME), ces options changent le schéma sans recopier les lignes.CONVERT TO CHARACTER SET utf8mb4 [COLLATE nom]convertit toutes les colonnes texte,JSONcompris : aprèsCONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,SHOW CREATE TABLEécrit`j` longtext DEFAULT NULL CHECK (json_valid(`j`))(interclassement de la table).- Changer l'interclassement d'une colonne de clé recontrôle la clé : des valeurs devenues égales (
'A1'et'a1'passant de binaire à général,'ß'et'ss'passant à Unicode) donnent 1062 et la table reste inchangée. - Changer l'interclassement d'une colonne de partitionnement est refusé (1235).
Expression#
expr COLLATE nom impose un interclassement à une expression texte :
SELECT 'a' COLLATE utf8mb4_bin = 'A'; -- 0
SELECT * FROM clients WHERE nom = 'strasse' COLLATE utf8mb4_unicode_ci; -- trouve « Straße »
SELECT code FROM liasse ORDER BY code COLLATE utf8mb4_general_ci;Le nom doit être un interclassement de utf8mb4 ('a' COLLATE utf8_bin ou COLLATE latin1_bin : 1253) ; COLLATE binary : 1064. Deux exceptions, pour les applications écrites pour des bases anciennes : appliqué directement à une colonne, le nom peut être celui d'un autre jeu (nom COLLATE utf8mb3_general_ci est accepté et compare comme l'interclassement correspondant) ; après CONVERT(x USING jeu), il est contrôlé contre le jeu écrit (CONVERT(x USING utf8mb3) COLLATE utf8mb3_general_ci est accepté).
Connexion#
Un littéral texte ('abc') prend l'interclassement de la connexion, @@collation_connection (coercibilité COERCIBLE : une colonne l'emporte toujours sur lui) :
SET NAMES utf8mb4 COLLATE utf8mb4_bin;
SELECT 'a' = 'A'; -- 0
SELECT * FROM clients WHERE nom = 'DUPONT'; -- interclassement de la colonne nom
SET NAMES utf8mb4; -- retour à utf8mb4_general_ciSET NAMES jeu COLLATE nom,SET collation_connection = nom(ouDEFAULT) changent l'interclassement des littéraux des instructions suivantes de la session ;SET NAMES jeuseul etSET character_set_connection = jeuremettent l'interclassement général,SET CHARACTER SET jeucelui de la base courante (@@collation_database).SET GLOBAL collation_connectionest sans effet.- Interclassement d'un autre jeu dans
SET NAMES: 1253. Nom inconnu du moteur mais préfixé d'un jeu reconnu (par exempleutf8mb4_0900_ai_ci, envoyé d'office par certains connecteurs) : accepté, interclassement général (SET collation_connectionajoute l'avertissement 1273). Nom qui ne se rattache à aucun jeu reconnu (SET NAMES utf8mb4 COLLATE klingon_ci,SET collation_connection | collation_server | collation_database = 'klingon_ci') : erreur 1273. - Jeu de caractères inconnu dans
SET NAMES,SET CHARACTER SET(SET CHARSET) ouSET character_set_client | _results | _connection | _server | _database: erreur 1115 (SET NAMES klingon).NULLn'est admis que pourcharacter_set_results(ailleurs : 1231). - L'interclassement est résolu à la compilation de l'instruction, sans coût par ligne. Il ne s'applique pas aux expressions rangées avec une table (valeur par défaut, colonne générée,
CHECK, partitionnement) ni au corps des événements : leurs littéraux restent en interclassement général, quelle que soit la session qui les exécute. - Objets gardés : comme la référence, une procédure, une fonction, un déclencheur ou une vue garde l'interclassement de la connexion de la session qui l'a créé. Les littéraux de son corps (ou de sa requête) y restent, quelle que soit la session qui l'appelle ou la lit, et même après un redémarrage. Une vue créée sous
SET NAMES utf8mb4 COLLATE utf8mb4_bincompare'a' = 'A'en binaire pour tout lecteur ; son résultat gardé (vue ordinaire ouCACHED,REFRESH VIEW) vaut pour toutes les sessions. L'interclassement figé se lit dans la colonnecollation_connectiondeSHOW CREATE PROCEDURE | FUNCTION | TRIGGER | VIEW, deSHOW PROCEDURE | FUNCTION STATUS,SHOW TRIGGERSet d'information_schema.ROUTINES,TRIGGERSetVIEWS(COLLATION_CONNECTION). Un objet créé avant cette version vaututf8mb4_general_ci. - Une variable utilisateur affectée d'un littéral garde l'interclassement de la connexion au moment de l'affectation (§ 13.3).
- Les paramètres
?d'une requête préparée (protocole binaire,EXECUTE … USING) prennent, comme un littéral, l'interclassement de la connexion au moment de l'exécution (coercibles) : aprèsSET NAMES utf8mb4 COLLATE utf8mb4_bin,? = 'A'vaut 0 pour'a', même pour une requête préparée avant leSET NAMES. - Une fonction qui rend un texte sans le tirer d'un argument texte (
HEX,MD5,DATE_FORMAT,FORMAT,CONCAT(1, 2),LPAD(1, 3, 0)…) le rend sous l'interclassement de la connexion, coercible ; dans une expression rangée avec une table ou une routine, sous l'interclassement général. - La session commence sous l'interclassement annoncé par le client à la connexion (numéro de la poignée de main) : 45
utf8mb4_general_ci, 46utf8mb4_bin, 224utf8mb4_unicode_ci, 246utf8mb4_unicode_520_ci. Tout autre numéro — 33 (utf8mb3), 255 (utf8mb4_0900_ai_ci, annoncé d'office par les connecteurs récents), numéro inconnu — laisseutf8mb4_general_ci.
13.3 Coercibilité : quel interclassement l'emporte#
Quand deux textes se rencontrent (=, <, IN, BETWEEN, CASE, LIKE, STRCMP, LOCATE, jointure, UNION, CONCAT…), chacun porte une coercibilité ; la plus faible l'emporte :
| Coercibilité | Valeur | Exemples |
|---|---|---|
EXPLICIT | 0 | expr COLLATE nom |
NONE | 1 | réservé (MIRAJ ne le produit plus, voir ci-dessous) |
IMPLICIT | 2 | colonne de table, de vue, de table dérivée ; NEW.col / OLD.col d'un déclencheur, variable ou paramètre de routine déclaré sous un interclassement Unicode ou binaire |
SYSCONST | 3 | USER(), DATABASE(), VERSION(), @@variable |
CAST | 4 | CAST(… AS CHAR), CONVERT(… USING utf8mb4) |
USERVAR | 5 | @v (sous l'interclassement de la valeur affectée) |
COERCIBLE | 6 | littéral, paramètre du client, fonction sans argument texte (HEX, DATE_FORMAT) ; NEW.col d'une colonne générale, variable de routine générale |
NUMERIC / IGNORABLE | 7 / 8 | nombres, dates, NULL : ne prennent pas part |
- Colonne contre littéral : la colonne l'emporte (
WHERE code = 'a1'sur une colonne binaire ne rend pas'A1') ; unCOLLATEexplicite l'emporte sur la colonne. - À coercibilité égale et interclassements différents, le plus large l'emporte : Unicode, puis général, puis binaire. Colonne binaire contre colonne générale : comparaison générale ; colonne générale contre colonne Unicode : comparaison Unicode ;
'a' COLLATE utf8mb4_bin = 'A' COLLATE utf8mb4_general_civaut 1. - La règle vaut pour tout nombre d'opérandes (
u IN (g, 'x'),CASE,BETWEEN,UNION), pour les fonctions (CONCAT(u, g)est Unicode implicite) et pour les jointures.
Écarts voulus avec la référence : MIRAJ ne lève jamais 1267, 1270 ni 1271, et une colonne binaire ne l'emporte plus sur une colonne générale ou Unicode (la référence y compare en binaire). Une base dont les tables ont été créées sous des défauts différents (utf8mb3_uca1400_ai_ci d'un côté, utf8mb3_general_ci de l'autre) compare ses colonnes sans erreur, en Unicode. Un index ne sert cette comparaison que du côté de la colonne déjà en Unicode (§ 13.5).
Variables, déclencheurs et routines#
- Variable utilisateur :
@vgarde l'interclassement de la valeur qu'on lui affecte (SET @v = x COLLATE utf8mb4_bin,SELECT col INTO @v,SELECT @v := col,SET @v = …dans une routine), coercibilitéUSERVAR: elle l'emporte sur un littéral (@v = 'a1'compare en binaire), pas sur une colonne. Une nouvelle affectation sansCOLLATEreprend l'interclassement de la valeur : celui de la connexion pour un littéral (SET NAMES … COLLATE), général par défaut. - Déclencheur :
NEW.coletOLD.colgardent l'interclassement de la colonne. Sur une colonne binaire,IF NEW.code = 'a1'est faux pour'A1'; sur une colonne Unicode,NEW.nom = 'ss'est vrai pour'ß'.COLLATION(NEW.code)rendutf8mb4_bin,COERCIBILITY(NEW.code)2. - Routine : un paramètre, une variable (
DECLARE v VARCHAR(20) COLLATE utf8mb4_unicode_ci) ou le résultat d'une fonction (RETURNS VARCHAR(20) COLLATE utf8mb4_bin) gardent l'interclassement déclaré ; l'attributBINARYvaututf8mb4_bin. Un nom d'interclassement que MIRAJ ne connaît pas y reste accepté sans effet (une routine enregistrée se relit toujours). - Sans
COLLATE: un paramètre, une variable (de routine ou de déclencheur) ou le résultat d'une fonction prend l'interclassement par défaut de la base au moment duCREATE, gardé avec l'objet : dans une baseutf8mb4_unicode_ci,DECLARE v VARCHAR(10) DEFAULT 'ß'puisv = 'ss'est vrai, même après unALTER DATABASE … COLLATE utf8mb4_general_ci(seules les routines créées ensuite prennent le nouveau défaut). La colonneDatabase CollationdeSHOW CREATEetinformation_schema.ROUTINES.DATABASE_COLLATIONmontrent ce défaut figé ;SHOW CREATE PROCEDURErend le texte tel qu'écrit, sansCOLLATEajouté.information_schema.PARAMETERS.COLLATION_NAMEdonne l'interclassement de chaque paramètre et du résultat. - Écart voulu :
NEW.cold'une colonne générale et une variable de routine sansCOLLATE(ou générale) restent coercibles (COERCIBILITYrend 6 et non 2). Contre une colonne binaire, la colonne l'emporte alors, comme sur la référence où le binaire gagne à coercibilité égale ; deux implicites prendraient ici le plus large (le général). Le chemin courant, tout en général, est inchangé.
13.4 Fonctions et opérateurs#
| Opération | Interclassement appliqué |
|---|---|
=, <, <=>, IN, BETWEEN, CASE, NULLIF, LEAST, GREATEST, STRCMP, FIELD, FIND_IN_SET | interclassement résolu des opérandes |
GROUP BY, DISTINCT, COUNT(DISTINCT), MIN / MAX, ORDER BY, fenêtres, jointures, UNION | celui de l'expression |
LIKE | résolu sur la valeur et le motif ; caractère contre caractère, sans PAD et sans expansion ('ß' LIKE 'ss' est faux en Unicode, 'Crème' LIKE 'Cr_me' vrai partout, LIKE 'crème' faux en binaire) |
LOCATE, INSTR, POSITION | fenêtre de même longueur en octets que la sous-chaîne, comparée sous l'interclassement (LOCATE('ss', 'Straße' COLLATE utf8mb4_unicode_ci) rend 5, LOCATE('a', 'A' COLLATE utf8mb4_bin) rend 0 ; en général LOCATE('ä', 'xá') rend 2 et LOCATE('e', 'é') 0) |
REGEXP, REGEXP_* | pas de poids ('é' REGEXP 'e' faux) ; insensible à la casse sauf en binaire ('ABC' COLLATE utf8mb4_bin REGEXP 'abc' vaut 0) ; le type de correspondance 'c' / 'i' l'emporte |
REPLACE, TRIM, SUBSTRING_INDEX | recherche binaire (sensible à la casse) dans les trois cas |
WEIGHT_STRING | celui du premier argument : général 16 bits par caractère, Unicode 16 bits par unité de poids (AS CHAR(n) coupe à n unités, complète par 0209), binaire 3 octets par caractère (complété par 000020) |
JSON_SEARCH | celui du document (colonne JSON : binaire ; littéral : général ; colonne texte : la sienne) |
JSON_UNQUOTE, ->> | résultat toujours utf8mb4_bin, coercibilité CAST (4), quel que soit l'argument : JSON_UNQUOTE('"a"') = 'A' vaut 0 ; contre une colonne, la colonne l'emporte |
JSON_EXTRACT, ->, JSON_VALUE, JSON_QUERY | celui de leurs arguments (document d'abord) |
MATCH … AGAINST | celui de l'index FULLTEXT : 'strasse' trouve Straße en Unicode, le binaire distingue casse et accents |
UPPER et LOWER restent des correspondances de casse Unicode quel que soit l'interclassement.
13.5 Index, clés et partitions#
Clés primaires et UNIQUE, index secondaires, clés étrangères, index trigramme et FULLTEXT, bornes et listes de partitions suivent l'interclassement de leur colonne : en binaire 'A1' et 'a1' sont deux clés, en Unicode 'ß' et 'ss' n'en font qu'une (1062). Un index ne sert une condition que si l'interclassement résolu de la condition est celui de la colonne : WHERE code COLLATE utf8mb4_general_ci = 'a1' lit toute la table. Un FULLTEXT sur des colonnes d'interclassements différents : 1283.
13.6 Métadonnées#
SHOW CREATE TABLEécritCHARACTER SET utf8mb4 COLLATE nomaprès le type d'une colonne dont l'interclassement diffère du défaut de la table, etDEFAULT CHARSET=utf8mb4 COLLATE=nomquand le défaut de la table n'est pas l'interclassement général ou n'est pas celui de la base.SHOW CREATE DATABASEajoute/*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE nom */quand le défaut de la base n'est pas l'interclassement général ;information_schema.SCHEMATA(DEFAULT_COLLATION_NAME) ;@@collation_database(relevé parUSE),@@collation_connection.SHOW FULL COLUMNS(colonneCollation),information_schema.COLUMNS.COLLATION_NAME,TABLES.TABLE_COLLATION.SHOW COLLATIONetinformation_schema.COLLATIONS: chaque nom accepté parCOLLATE, avec le numéro, le jeu et leSortlende la référence, tousPAD SPACE:latin1_swedish_ci(8, défaut),latin1_bin(47),latin1_general_ci(48),utf8mb3_general_ci(33, défaut),utf8mb3_bin(83),utf8mb3_unicode_ci(192),utf8mb3_unicode_520_ci(214),utf8mb4_general_ci(45, défaut),utf8mb4_bin(46),utf8mb4_unicode_ci(224),utf8mb4_unicode_520_ci(246) ;Sortlen8 pour lesunicode, 1 pour les autres.utf8mb4_uca1400_ai_ci(2304) etutf8mb3_uca1400_ai_ci(2048) ne figurent que dansCOLLATION_CHARACTER_SET_APPLICABILITY, comme sur la référence (qui y écrituca1400_ai_cidansCOLLATION_NAME; MIRAJ le nom complet). Les aliasutf8_…sont listés sous leur nomutf8mb3_…. Chaque nom est rangé sous l'un des cinq interclassements du moteur (§ 13.1).SHOW CHARACTER SETetinformation_schema.CHARACTER_SETS:latin1(cp1252 West European, 1),utf8mb3(3) etutf8mb4(4), défaut général ;latin1etutf8mb3sont acceptés mais rangés enutf8mb4(§ 13.8).- La référence 12.2 ne marque plus
utf8mb4_general_ciniutf8mb3_general_cicomme défaut de leur jeu (son défaut estuca1400_ai_ci) ; MIRAJ, dont c'est le défaut, les marque. - Protocole : une colonne de résultat Unicode ou binaire est annoncée 224 ou 46 ; une colonne générale, comme une colonne
JSON, reste annoncée 33.
13.7 Erreurs#
| Code | Cas |
|---|---|
| 1062 | doublon sous l'interclassement de la clé (aussi à l'ALTER qui change l'interclassement) |
| 1064 | COLLATE binary sur un texte |
| 1235 | changer l'interclassement d'une colonne de partitionnement ; ALTER DATABASE … UPGRADE DATA DIRECTORY NAME |
| 1253 | interclassement d'un autre jeu (CHARACTER SET latin1 COLLATE utf8mb4_unicode_ci, 'a' COLLATE utf8_bin) |
| 1273 | nom inconnu : Unknown collation: 'utf8mb4_0900_ai_ci' |
| 1283 | FULLTEXT sur des colonnes d'interclassements différents |
| 1302 | BINARY et un COLLATE autre que binaire sur la même colonne |
13.8 Écarts et hors périmètre#
- Comparer
unicode_ciàunicode_520_ci(ou àuca1400_ai_ci) donne 1267 sur la référence ; MIRAJ compare sous la table la plus récente, sans erreur. - Une table créée avant le 17/10/2026 sous
unicode_520_ciouuca1400_ai_ciavait été rangée sousunicode_ci: elle le reste (son fichier ne garde queunicode), etSHOW CREATE TABLEl'écrit ainsi ; ses index restent valides.ALTER TABLE … CONVERT TO CHARACTER SET utf8mb4 COLLATE …la passe sous la table voulue. LIKE 'préfixe%'sousuca1400_ai_cipar un index : la référence calcule l'intervalle sans tenir compte des contractions et perd des lignes ('И' + brève LIKE 'И%') ; MIRAJ rend toujours le résultat de l'évaluation ligne à ligne.- Mélanges sans vainqueur : la référence lève 1267 / 1270 / 1271, MIRAJ compare sous le plus large (§ 13.3).
CHARACTER SET utf8mb4seul,SET NAMES utf8mb4sansCOLLATE,CONVERT(… USING utf8mb4), l'introducteur_utf8mb4et la poignée de main d'un client qui annonce 45 donnent l'interclassement général ; la référence 12.x y metuca1400_ai_ci(variablecharacter_set_collations), si bien que sur elle même un serveur lancé avec--collation-server=utf8mb4_general_cicompare les littéraux d'une connexion sousuca1400_ai_ci. Les tables UCA 14 étant désormais exactes, ce défaut est un choix gardé (compatibilité des bases et des vidages écrits sansCOLLATEsous la 10.x), non une limite.- Colonne
CHARACTER SET latin1(ouutf8mb3) : acceptée, rangée enutf8mb4sous l'interclassement général (ou binaire pourlatin1_bin), et affichée comme telle (CHARACTER SET utf8mb4 COLLATE utf8mb4_general_cidans une table non générale ; la référence :CHARACTER SET latin1 COLLATE latin1_swedish_ci). Écart gardé : afficherlatin1ferait croire aux outils qui relisentSHOW CREATE TABLEque la colonne ne prend que des caractèreslatin1. - Numéro 255 (
utf8mb4_0900_ai_ci) à la connexion : session enutf8mb4_general_ci(selon sa version, la référence en fait un alias d'un interclassement Unicode ; non relevé) ; une variable utilisateur passée àEXECUTE … USINGy prend l'interclassement de la connexion, non le sien. NEW.cold'une colonne générale et variables de routine générales : coercibles et non implicites (§ 13.3, « Variables, déclencheurs et routines »).- Littéraux des événements et des expressions de table : toujours en interclassement général (la référence garde, pour un événement, l'interclassement de connexion de sa création). Routines et déclencheurs écrits en langage PostgreSQL : rien n'est figé, interclassement général.
- Écriture au travers d'une vue (
UPDATE/DELETE/INSERTsur une vue modifiable,WITH CHECK OPTION) : les conditions de la vue, recopiées dans l'instruction réécrite, sont compilées sous l'interclassement de la session qui écrit, non sous celui figé avec la vue. - Défaut de base figé d'une routine ou d'un déclencheur : seul l'interclassement est gardé, non le jeu de caractères (toujours
utf8mb4) ; la colonnecharacter_set_clientvaut toujoursutf8mb4. SHOW CREATE DATABASEd'une base à l'interclassement général garde la forme courte (CREATE DATABASE `nom`) ; la référence écrit toujours le commentaire/*!40100 … */.CHARSET(),COLLATION()etCOERCIBILITY()sont disponibles (chapitre 10, §10.9) : elles rendent le jeu, l'interclassement et la coercibilité (0 à 8) de l'expression telle que le moteur la résout,binarypour un nombre, une date ouNULL,latin1/latin1_swedish_ciouutf8mb3pourCONVERT(… USING jeu).- Hors périmètre : interclassements
NO PAD, sensibles à la casse ou aux accents autres que binaires (*_as_cs,*_ai_cs), linguistiques (german2,czech,turkish…),utf8mb4_0900_*: 1273. - Bases existantes : toute table créée avant les interclassements est lue en interclassement général, index et partitions inchangés ; seul un
ALTER TABLE … COLLATEvolontaire la change.