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 empfehlen

Lösung für das Jitter-Problem beim CSS3-Transformationsübergang

transform: scale(); Skalierung verursacht Jitter ...

So leiten Sie den Nginx-Verzeichnispfad um

Wenn der Pfad nach dem Domänennamen auf andere Ve...

Apple Mac OS X in VMWare12 installieren – Grafik-Tutorial

1. Einleitung: Da mein Freund einige Systemkenntn...

Implementierungsmethode für HTML-Neun-Raster-Layouts

Die Diversifizierung von Website-Layouts ist unse...

Beispielcode zur Implementierung von dynamischem Skinning mit vue+element

Manchmal kann das Thema eines Projekts nicht jede...

Beispielcode zur Implementierung eines einfachen ListViews-Effekts in HTML

HTML zum Erreichen eines einfachen ListViews-Effe...

CSS3 realisiert den Effekt der kontinuierlichen Dreiecksvergrößerung

1. CSS3-Dreieck vergrößert weiterhin Spezialeffek...

Linux verwendet NetworkManager, um Ihre MAC-Adresse zufällig zu generieren

Egal, ob Sie zu Hause auf dem Sofa oder draußen i...

Detaillierte Erklärung von PID und Socket in MySQL

Inhaltsverzeichnis 1. Einführung in die PID-Datei...

Einführung in den Aufbau von NFS-Diensten unter Centos7

Inhaltsverzeichnis 1. Server 2. Kunde 3. Testdien...

Ein wenig bekanntes JS-Problem: [] == ![] ist wahr, aber {} == !{} ist falsch

konsole.log( [] == ![] ) // wahr console.log( {} ...