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

Eine kurze Diskussion über HTML-Dokumenttypen und -Kodierung

DOKTYP Doctype wird verwendet, um dem Browser mit...

Vue verwendet Mixins zur Optimierung von Komponenten

Inhaltsverzeichnis Mixins-Implementierung Zusamme...

Linux-Methodenbeispiel zum Anzeigen aller Informationen des Prozesses

Auf dem Server läuft ein Taskprozess. Wenn wir ih...

Einige Parameterbeschreibungen von Texteingabefeldern im Webdesign

In Gästebüchern, Foren und anderen Orten werden i...

Freigabe der Schritte zum SVN-Dienstsicherungsvorgang

Schritte zur Sicherung des SVN-Dienstes 1. Quells...

Implementierung der React-Sternebewertungskomponente

Voraussetzung ist die Eingabe der Bewertungsdaten...

WeChat Mini-Programm: Position des Videofeuers zufällig

In diesem Artikel wird der spezifische Code zur z...