L'erreur lorsque MySQL rejoint plusieurs tables est la suivante : [Err]1267 – Mélange illégal de classements (utf8_general_ci,IMPLICIT) et (utf8_unicode_ci,IMPLICIT) pour l'opération '=
C'est-à-dire, deux tables Les règles de classement (COLLATION) sont différentes et la comparaison ne peut pas être complétée. COLLATION est utilisé pour le tri et la comparaison de taille. Un jeu de caractères comporte une ou plusieurs COLLATIONS et se termine par _ci (insensible à la casse), _cs (sensible à la casse) ou _bin (binaire). Lorsque vous effectuez des comparaisons, vous devez vous assurer que l’ordre des caractères des deux tableaux est le même. Généralement, vous ne spécifiez pas lors de la création d'une table. Vous pouvez utiliser la valeur par défaut. Si toutes les tables sont définies par défaut, il n'y aura aucun problème. Cet article présente principalement l'analyse des différentes erreurs dans les règles de tri des tables MySQL. J'espère que cela pourra aider tout le monde.
Simulons différents scénarios. La structure de la table est la suivante (la règle de tri par défaut de utf8 est utf8_general_ci) :
mysql> show create table test.cs\G *************************** 1. row *************************** Table: cs Create Table: CREATE TABLE `cs` ( `id` int(11) DEFAULT NULL, `name` varchar(10) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.01 sec)
Voir Ensemble de classement par défaut de la table
mysql> select TABLE_SCHEMA,TABLE_NAME,TABLE_COLLATION from information_schema.tables where table_name='cs'; +--------------+------------+-----------------+ | TABLE_SCHEMA | TABLE_NAME | TABLE_COLLATION | +--------------+------------+-----------------+ | test | cs | utf8_general_ci | +--------------+------------+-----------------+ 1 row in set (0.00 sec)
Afficher l'ensemble de classement des colonnes
mysql> select TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,COLLATION_NAME from information_schema.COLUMNS where TABLE_NAME='cs'; +--------------+------------+-------------+-----------------+ | TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | COLLATION_NAME | +--------------+------------+-------------+-----------------+ | test | cs | id | NULL | | test | cs | name | utf8_general_ci | +--------------+------------+-------------+-----------------+ 2 rows in set (0.00 sec)
La mise à niveau de utf8 vers utf8mb4 est Le ddl en ligne n'est pas pris en charge, comme suit :
mysql> ALTER TABLE cs CONVERT TO CHARACTER SET utf8mb4,ALGORITHM=INPLACE,LOCK=NONE; ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
Le passage de utf8.utf8_general_ci à utf8.utf8_unicode_ci ne prend pas en charge le ddl en ligne, comme suit :
mysql> ALTER TABLE cs CONVERT TO CHARACTER SET utf8 collate utf8_unicode_ci,ALGORITHM=INPLACE,LOCK=NONE; ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
Si vous utilisez la méthode suivante pour modifier le jeu de caractères, vous constaterez que seul le niveau du tableau est modifié, pas le niveau de la colonne.
mysql> ALTER TABLE cs CHARACTER SET utf8 collate utf8_unicode_ci; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> select TABLE_SCHEMA,TABLE_NAME,TABLE_COLLATION from information_schema.tables where table_name='cs'; +--------------+------------+-----------------+ | TABLE_SCHEMA | TABLE_NAME | TABLE_COLLATION | +--------------+------------+-----------------+ | test | cs | utf8_unicode_ci | +--------------+------------+-----------------+ 1 row in set (0.00 sec) mysql> select TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,COLLATION_NAME from information_schema.COLUMNS where TABLE_NAME='cs'; +--------------+------------+-------------+-----------------+ | TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | COLLATION_NAME | +--------------+------------+-------------+-----------------+ | test | cs | id | NULL | | test | cs | name | utf8_general_ci | +--------------+------------+-------------+-----------------+ 2 rows in set (0.00 sec)
N'oubliez donc pas d'ajouter CONVERT TO lorsque vous modifiez réellement le jeu de caractères, comme suit :
mysql> ALTER TABLE cs CONVERT TO CHARACTER SET utf8 collate utf8_unicode_ci; Query OK, 5 rows affected (0.06 sec) Records: 5 Duplicates: 0 Warnings: 0 mysql> select TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,COLLATION_NAME from information_schema.COLUMNS where TABLE_NAME='cs'; +--------------+------------+-------------+-----------------+ | TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | COLLATION_NAME | +--------------+------------+-------------+-----------------+ | test | cs | id | NULL | | test | cs | name | utf8_unicode_ci | +--------------+------------+-------------+-----------------+ 2 rows in set (0.00 sec)
Pour modifier uniquement le jeu de caractères par défaut d'un tableau, vous devez utiliser cette instruction :
mysql> ALTER TABLE cs default CHARACTER SET utf8 collate utf8_general_ci,ALGORITHM=INPLACE,LOCK=NONE; Query OK, 0 rows affected (0.00 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> select TABLE_SCHEMA,TABLE_NAME,TABLE_COLLATION from information_schema.tables where table_name='cs'; +--------------+------------+-----------------+ | TABLE_SCHEMA | TABLE_NAME | TABLE_COLLATION | +--------------+------------+-----------------+ | test | cs | utf8_general_ci | +--------------+------------+-----------------+ 1 row in set (0.00 sec) mysql> select TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,COLLATION_NAME from information_schema.COLUMNS where TABLE_NAME='cs'; +--------------+------------+-------------+-----------------+ | TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | COLLATION_NAME | +--------------+------------+-------------+-----------------+ | test | cs | id | NULL | | test | cs | name | utf8_unicode_ci | +--------------+------------+-------------+-----------------+ 2 rows in set (0.00 sec)
Vous pouvez constater que le jeu de caractères de la colonne a pas modifié, et uniquement les nouvelles colonnes. Le jeu de caractères de la table (utf8.utf8_general_ci) sera hérité par défaut.
Recommandations associées :
Explication détaillée du code des quatre types de partition de la table MySQL
Comment utiliser la connexion à la table MySQL
Comment résoudre le problème du chinois tronqué dans la table php mysql
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!