Analyse verschiedener Fehler bei Sortierregeln für MySQL-Tabellen

Analyse verschiedener Fehler bei Sortierregeln für MySQL-Tabellen

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

Dies bedeutet, dass die Sortierregeln (COLLATION) der beiden Tabellen unterschiedlich sind und der Vergleich nicht abgeschlossen werden kann. COLLATION wird zum Sortieren und Größenvergleich verwendet. Ein Zeichensatz hat eine oder mehrere COLLATIONen und endet mit _ci (ohne Berücksichtigung der Groß-/Kleinschreibung), _cs (mit Berücksichtigung der Groß-/Kleinschreibung) oder _bin (binär). Bei einem Vergleich sollten Sie darauf achten, dass die Zeichenreihenfolge beider Tabellen identisch ist. Normalerweise geben Sie es beim Erstellen einer Tabelle nicht an. Sie können die Standardeinstellung verwenden. Es gibt kein Problem, wenn alle Standardeinstellungen verwendet werden.

Lassen Sie uns verschiedene Szenarien simulieren. Die Tabellenstruktur ist wie folgt (die Standardsortierregel für utf8 ist utf8_general_ci):

mysql> anzeigen, Tabelle erstellen, test.cs\G
*************************** 1. Reihe ***************************
    Tabelle: cs
Tabelle erstellen: CREATE TABLE `cs` (
 `id` int(11) DEFAULT NULL,
 `name` varchar(10) STANDARD NULL
) ENGINE=InnoDB STANDARD-CHARSET=utf8
1 Zeile im Satz (0,01 Sek.)

Anzeigen des für eine Tabelle festgelegten Standardsortiersatzes

mysql> wähle TABLE_SCHEMA,TABLE_NAME,TABLE_COLLATION aus information_schema.tables, wobei table_name='cs';
+--------------+------------+-----------------+
| TABELLE_SCHEMA | TABELLE_NAME | TABELLE_SAMMLUNG |
+--------------+------------+-----------------+
| Test | cs | utf8_general_ci |
+--------------+------------+-----------------+
1 Zeile im Satz (0,00 Sek.)

Spaltensortierungssatz anzeigen

mysql> wähle TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,COLLATION_NAME aus information_schema.COLUMNS, wobei TABLE_NAME='cs';
+--------------+------------+-------------+-----------------+
| TABELLENSCHEMA | TABELLENNAME | SPALTENNAME | SORTIMENTSNAME |
+--------------+------------+-------------+-----------------+
| Test | cs | ID | NULL |
| Test | cs | Name | utf8_general_ci |
+--------------+------------+-------------+-----------------+
2 Zeilen im Satz (0,00 Sek.)

Das Upgrade von UTF8 auf UTF8MB4 unterstützt kein Online-DDL:

mysql> ALTER TABLE cs IN ZEICHENSATZ KONVERTIEREN utf8mb4, ALGORITHM=INPLACE, LOCK=NONE;
FEHLER 1846 (0A000): ALGORITHM=INPLACE wird nicht unterstützt. Grund: Spaltentyp INPLACE kann nicht geändert werden. Versuchen Sie ALGORITHM=COPY.

Das Ändern von utf8.utf8_general_ci zu utf8.utf8_unicode_ci unterstützt kein Online-DDL, wie folgt:

mysql> ALTER TABLE cs IN ZEICHENSATZ KONVERTIEREN utf8 sortieren utf8_unicode_ci,ALGORITHM=INPLACE,LOCK=NONE;
FEHLER 1846 (0A000): ALGORITHM=INPLACE wird nicht unterstützt. Grund: Spaltentyp INPLACE kann nicht geändert werden. Versuchen Sie ALGORITHM=COPY.

Wenn Sie den Zeichensatz folgendermaßen ändern, werden Sie feststellen, dass nur die Tabellenebene geändert wird, nicht aber die Spaltenebene.

mysql> ALTER TABLE cs CHARACTER SET utf8 collate utf8_unicode_ci;      
Abfrage OK, 0 Zeilen betroffen (0,01 Sek.)
Datensätze: 0 Duplikate: 0 Warnungen: 0
 
mysql> wähle TABLE_SCHEMA,TABLE_NAME,TABLE_COLLATION aus information_schema.tables, wobei table_name='cs';      
+--------------+------------+-----------------+
| TABELLE_SCHEMA | TABELLE_NAME | TABELLE_SAMMLUNG |
+--------------+------------+-----------------+
| Test | cs | utf8_unicode_ci |
+--------------+------------+-----------------+
1 Zeile im Satz (0,00 Sek.)
 
mysql> wähle TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,COLLATION_NAME aus information_schema.COLUMNS, wobei TABLE_NAME='cs';
+--------------+------------+-------------+-----------------+
| TABELLENSCHEMA | TABELLENNAME | SPALTENNAME | SORTIMENTSNAME |
+--------------+------------+-------------+-----------------+
| Test | cs | ID | NULL |
| Test | cs | Name | utf8_general_ci |
+--------------+------------+-------------+-----------------+
2 Zeilen im Satz (0,00 Sek.)

Wenn Sie den Zeichensatz also wirklich ändern, vergessen Sie nicht, CONVERT TO wie folgt hinzuzufügen:

mysql> ALTER TABLE cs IN ZEICHENSATZ KONVERTIEREN utf8 collate utf8_unicode_ci;
Abfrage OK, 5 Zeilen betroffen (0,06 Sek.)
Datensätze: 5 Duplikate: 0 Warnungen: 0
 
mysql> wähle TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,COLLATION_NAME aus information_schema.COLUMNS, wobei TABLE_NAME='cs';
+--------------+------------+-------------+-----------------+
| TABELLENSCHEMA | TABELLENNAME | SPALTENNAME | SORTIMENTSNAME |
+--------------+------------+-------------+-----------------+
| Test | cs | ID | NULL |
| Test | cs | Name | utf8_unicode_ci |
+--------------+------------+-------------+-----------------+
2 Zeilen im Satz (0,00 Sek.)

Um den Standardzeichensatz für nur eine Tabelle zu ändern, verwenden Sie diese Anweisung:

mysql> ALTER TABLE cs Standard-Zeichensatz utf8 sortieren utf8_general_ci, ALGORITHM=INPLACE, LOCK=NONE;         
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)
Datensätze: 0 Duplikate: 0 Warnungen: 0
 
mysql> wähle TABLE_SCHEMA,TABLE_NAME,TABLE_COLLATION aus information_schema.tables, wobei table_name='cs';      
+--------------+------------+-----------------+
| TABELLE_SCHEMA | TABELLE_NAME | TABELLE_SAMMLUNG |
+--------------+------------+-----------------+
| Test | cs | utf8_general_ci |
+--------------+------------+-----------------+
1 Zeile im Satz (0,00 Sek.)
 
mysql> wähle TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,COLLATION_NAME aus information_schema.COLUMNS, wobei TABLE_NAME='cs';  
+--------------+------------+-------------+-----------------+
| TABELLENSCHEMA | TABELLENNAME | SPALTENNAME | SORTIMENTSNAME |
+--------------+------------+-------------+-----------------+
| Test | cs | ID | NULL |
| Test | cs | Name | utf8_unicode_ci |
+--------------+------------+-------------+-----------------+
2 Zeilen im Satz (0,00 Sek.)

Sie können feststellen, dass sich der Spaltenzeichensatz nicht geändert hat und nur neue Spalten standardmäßig den Tabellenzeichensatz (utf8.utf8_general_ci) erben.

Zusammenfassen

Dies ist der gesamte Inhalt dieses Artikels zur Analyse verschiedener Fehlerprobleme in MySQL-Tabellensortierregeln. Ich hoffe, er wird für alle hilfreich sein. Interessierte Freunde können sich auf Folgendes beziehen: Mehrere wichtige MySQL-Variablen, Analyse der deklarierten MySQL-Variablen und gespeicherten Prozeduren, Detaillierte Code-Erklärung der Beziehung zwischen dem Binlog der MySQL-Masterbibliothek (Master-Log) und dem Relay-Log der Slave-Bibliothek, Detaillierte Erklärung des MySQL-Vorbereitungsprinzips usw. Wenn Sie Fragen haben, können Sie jederzeit eine Nachricht hinterlassen, um miteinander zu kommunizieren und gemeinsam Fortschritte zu erzielen.

Das könnte Sie auch interessieren:
  • MySQL Order By-Codebeispiel für Sortierregeln für mehrere Felder
  • Zusammenfassung der Unterschiede zwischen utf8_unicode_ci und utf8_general_ci in MySQL

<<:  JavaScript+HTML zur Implementierung eines Studenteninformationsmanagementsystems

>>:  So erstellen Sie einen NFS-Dienst in Ubuntu 16.04

Artikel    

Artikel empfehlen

Beispielcode zur Implementierung der Ellipsenbahnrotation mit CSS3

In letzter Zeit müssen folgende Effekte erzielt w...

Ubuntu kompiliert Kernelmodule und der Inhalt wird im Systemprotokoll angezeigt

Inhaltsverzeichnis 1.Linux-Anmeldeschnittstelle 2...

Anweisungen zur Verwendung des Datenbankverbindungspools Druid

Ersetzen Sie ihn durch den optimalen Datenbankver...

Zusammenfassung einiger gängiger Protokolle in MySQL

Vorwort: Im MySQL-System gibt es viele verschiede...

Vue implementiert nahtloses Scrollen von Listen

In diesem Artikelbeispiel wird der spezifische Co...

Starten Sie die auf Docker basierende nginxssl-Konfiguration

Voraussetzungen Ein Cloud-Server (centOS von Alib...

Einführung in Sublime Text 2, ein Web-Frontend-Tool

Sublime Text 2 ist ein leichter, einfacher, effiz...

Detaillierte Schritte zum Erstellen eines Vue-Scaffolding-Projekts

Vue-Gerüst -> vue.cli Erstellen Sie schnell ei...

Erfahren Sie mehr über den Ereignisplaner EVENT in MySQL

Der Ereignisplaner in MySQL, EVENT, wird auch als...

Quellcodeanalyse des Nodejs-Modulsystems

Inhaltsverzeichnis Überblick CommonJS-Spezifikati...

So verwenden Sie reguläre Ausdrucksabfragen in MySql

Reguläre Ausdrücke werden häufig verwendet, um Te...