Heim  >  Artikel  >  Datenbank  >  Analyse von Fehlerberichten, die durch unterschiedliche Sortierregeln für MySQL-Tabellen verursacht werden

Analyse von Fehlerberichten, die durch unterschiedliche Sortierregeln für MySQL-Tabellen verursacht werden

小云云
小云云Original
2017-12-14 11:49:311738Durchsuche

Der Fehler, wenn MySQL mehrere Tabellen verknüpft, lautet wie folgt: [Err]1267 – Unzulässige Mischung aus Sortierungen (utf8_general_ci,IMPLICIT) und (utf8_unicode_ci,IMPLICIT) für Operation '=

Das heißt, zwei Tabellen Die Sortierung (COLLATION) ist unterschiedlich und der Vergleich kann nicht abgeschlossen werden. COLLATION wird zum Sortieren und Größenvergleich verwendet. Ein Zeichensatz verfügt über eine oder mehrere COLLATIONs und endet mit _ci (Groß-/Kleinschreibung beachten), _cs (Groß-/Kleinschreibung beachten) oder _bin (binär). Bei Vergleichen sollten Sie darauf achten, dass die Zeichenreihenfolge beider Tabellen gleich ist. Im Allgemeinen geben Sie beim Erstellen einer Tabelle nichts an. Wenn alles die Standardeinstellung ist, gibt es kein Problem. In diesem Artikel wird hauptsächlich die Analyse verschiedener Fehler in den Sortierregeln für MySQL-Tabellen vorgestellt. Ich hoffe, dass er allen helfen kann.

Lassen Sie uns verschiedene Szenarien simulieren. Die Tabellenstruktur ist wie folgt (die Standardsortierregel von utf8 ist 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)

Ansicht Tabelle Standard-Sortierungssatz


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)

Spalten-Sortierungssatz anzeigen


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)

Ein Upgrade von utf8 auf utf8mb4 ist möglich Online-DDL wird wie folgt nicht unterstützt:


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.

Beim Wechsel von utf8.utf8_general_ci zu utf8.utf8_unicode_ci wird Online-DDL wie folgt nicht unterstützt:


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.

Wenn Sie den Zeichensatz mit der folgenden Methode ändern, werden Sie feststellen, dass nur die Tabellenebene geändert wird, nicht die Spaltenebene.


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)

Vergessen Sie also nicht, CONVERT TO hinzuzufügen, wenn Sie den Zeichensatz tatsächlich ändern, und zwar wie folgt:


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)

Um nur den Standardzeichensatz einer Tabelle zu ändern, sollten Sie diese Anweisung verwenden:


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)

Sie können feststellen, dass der Spaltenzeichensatz vorhanden ist nicht geändert und nur neue Spalten Der Zeichensatz der Tabelle (utf8.utf8_general_ci) wird standardmäßig geerbt.

Verwandte Empfehlungen:

Detaillierte Codeerklärung der vier Partitionstypen der MySQL-Tabelle

So verwenden Sie die MySQL-Tabellenverbindung

So lösen Sie das chinesische verstümmelte Problem in der PHP-MySQL-Tabelle

Das obige ist der detaillierte Inhalt vonAnalyse von Fehlerberichten, die durch unterschiedliche Sortierregeln für MySQL-Tabellen verursacht werden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn