Maison > base de données > tutoriel mysql > Analyse des rapports d'erreurs causés par différentes règles de tri des tables MySQL

Analyse des rapports d'erreurs causés par différentes règles de tri des tables MySQL

小云云
Libérer: 2017-12-14 11:49:31
original
1785 Les gens l'ont consulté

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)
Copier après la connexion

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)
Copier après la connexion

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)
Copier après la connexion

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.
Copier après la connexion

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.
Copier après la connexion

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)
Copier après la connexion

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)
Copier après la connexion

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)
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal