Zeichensatz und Sortierung einer Datenbank aktualisieren

Auf dieser Seite wird beschrieben, wie Sie den Zeichensatz und die Sortierung von Cloud SQL-Datenbanken aktualisieren.

Übersicht

Wenn Sie eine Datenbank in Cloud SQL for MySQL erstellen, können Sie die Konfiguration für Zeichensatz und Sortierung für die Datenbank angeben. Wenn Sie keine benutzerdefinierten Werte für diese Einstellungen angeben, verwendet die Datenbank den Standardwert. In MySQL können Sie benutzerdefinierte Werte für den Zeichensatz und die Sortierung auf verschiedenen Objektebenen angeben, wie auf Datenbank-, Tabellen- und Spaltenebene. Weitere Informationen zur Verwendung von Zeichensatz- und Sortierungskonfigurationen in MySQL finden Sie unter Zeichensätze, Sortierungen, Unicode.

Wenn Sie den Zeichensatz oder die Sortierung Ihrer Datenbank ändern möchten, nachdem Sie die Datenbank und einige Objekte darin erstellt haben, können Sie dies mithilfe der Anleitung in diesem Dokument tun.

Dieser Vorgang besteht aus den folgenden Schritten:

  1. Die aktuellen Werte für den Zeichensatz und die Sortierung prüfen
  2. Bestimmen, auf welcher Ebene aktualisiert werden soll
  3. Instanz sichern
  4. Befehle für die Neuerstellung gespeicherter Datenbankobjekte generieren
  5. Datenbanken und gegebenenfalls Tabellen und Spalten aktualisieren
  6. Aktualisierungen prüfen und nach Fehlern suchen
  7. Gespeicherte Datenbankobjekte neu erstellen
  8. Eine weitere Sicherung der Instanz erstellen

Aktuelle Werte für Zeichensatz und Sortierung prüfen

Prüfen Sie die vorhandenen Werte, die für den Zeichensatz und die Sortierung für Ihre Datenbank und Datenbankobjekte konfiguriert sind. Prüfen Sie bei der Überprüfung Ihrer Datenbank auch die Konfiguration der Tabellen, Spalten und gespeicherten Objekte. Mit den folgenden Anweisungen können Sie Ihre Datenbanken und ihre Datenbankobjekte prüfen.

Instanzkonfiguration prüfen

Wenn Sie die Standard-Globalwerte auf Instanzebene (Server) prüfen möchten, starten Sie eine MySQL-Shell und geben Sie den folgenden Befehl ein:

mysql> SELECT @@character_set_server,@@collation_server;

Beispielausgabe:

+------------------------+--------------------+
| @@character_set_server | @@collation_server |
+------------------------+--------------------+
| utf8mb4                | utf8mb4_0900_ai_ci |
+------------------------+--------------------+
1 row in set (0.00 sec)

Sie können prüfen, ob sich die Standard-Globalwerte von den benutzerdefinierten Werten unterscheiden, die Sie später für Ihre Datenbank angeben.

Datenbankkonfiguration prüfen

Verwenden Sie die folgende Anweisung, um die vorhandenen Werte für Zeichensatz und Sortierung auf Datenbankebene zu prüfen. Erstellen Sie nach dem Ausführen jeder Anweisung eine Liste aller Datenbanken und Datenbankobjekte, die Sie mit neuen Werten für die Zeichensätze oder die Sortierung aktualisieren müssen. Die Liste hängt davon ab, welche Datenbanken Sie ändern möchten und wie viele Tabellen, Spalten und Datenbankobjekte Konfigurationsupdates erfordern.

SELECT * FROM INFORMATION_SCHEMA.SCHEMATA
WHERE schema_name
NOT IN ('performance_schema', 'mysql', 'sys', 'information_schema');

Sie erhalten beispielsweise die folgende Ausgabe:

+--------------+-------------+----------------------------+------------------------+----------+--------------------+
| CATALOG_NAME | SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | SQL_PATH | DEFAULT_ENCRYPTION |
+--------------+-------------+----------------------------+------------------------+----------+--------------------+
| def          | test1       | utf8mb4                    | utf8mb4_0900_ai_ci     |     NULL | NO                 |
| def          | test2       | utf8mb4                    | utf8mb4_0900_ai_ci     |     NULL | NO                 |
| def          | test3       | utf8mb4                    | utf8mb4_0900_ai_ci     |     NULL | NO                 |
| def          | test4       | utf8mb4                    | utf8mb4_0900_ai_ci     |     NULL | NO                 |
+--------------+-------------+----------------------------+------------------------+----------+--------------------+

Sie möchten in den Datenbanken jedoch die folgenden Werte für benutzerdefinierte Zeichensätze ändern:

+--------------+-------------+----------------------------+------------------------+----------+--------------------+
| CATALOG_NAME | SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | SQL_PATH | DEFAULT_ENCRYPTION |
+--------------+-------------+----------------------------+------------------------+----------+--------------------+
| def          | test1       | ascii                      | ascii_general_ci       |     NULL | NO                 |
| def          | test2       | latin1                     | latin1_swedish_ci      |     NULL | NO                 |
| def          | test3       | utf16                      | utf16_general_ci       |     NULL | NO                 |
| def          | test4       | ucs2                       | ucs2_general_ci        |     NULL | NO                 |
+--------------+-------------+----------------------------+------------------------+----------+--------------------+

In diesem Fall müssen Sie für jede Datenbank, die einen Wert enthält, den Sie ändern möchten, jedes Objekt in der Datenbank aktualisieren.

Konfiguration der Tabellen prüfen

Mit der folgenden Anweisung können Sie die vorhandenen Werte für die Tabellen prüfen:

SELECT T.table_name, T.table_schema, CCSA.character_set_name, CCSA.collation_name
FROM information_schema.`tables` T,
  information_schema.`collation_character_set_applicability` CCSA
WHERE CCSA.collation_name = T.table_collation
AND T.table_schema
NOT IN ('performance_schema', 'mysql', 'sys','information_schema');

Beispielausgabe:

+------------+--------------+--------------------+-------------------+
| TABLE_NAME | TABLE_SCHEMA | CHARACTER_SET_NAME | COLLATION_NAME    |
+------------+--------------+--------------------+-------------------+
| t1         | test1        | ascii              | ascii_general_ci  |
| t2         | test2        | latin1             | latin1_swedish_ci |
| t3         | test3        | utf16              | utf16_general_ci  |
| t4         | test4        | ucs2               | ucs2_general_ci   |
+------------+--------------+--------------------+-------------------+

Konfiguration der Tabellenspalten prüfen

Verwenden Sie die folgende Anweisung, um die Werte für Spalten zu prüfen:

SELECT table_schema, table_name, column_name, character_set_name, collation_name
FROM information_schema.columns
WHERE table_schema NOT IN ('information_schema', 'performance_schema', 'sys', 'mysql');

Beispielausgabe:

+--------------+------------+-------------+--------------------+------------------+
| TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | CHARACTER_SET_NAME | COLLATION_NAME   |
+--------------+------------+-------------+--------------------+------------------+
| test1        | t1         | c           | ascii              | ascii_general_ci |
| test1        | t1         | i           | NULL               | NULL             |
| test2        | t2         | j           | NULL               | NULL             |
| test2        | t2         | v           | ascii              | ascii_general_ci |
| test3        | t3         | k           | NULL               | NULL             |
| test3        | t3         | summary     | utf16              | utf16_general_ci |
| test4        | t4         | col         | ucs2               | ucs2_general_ci  |
| test4        | t4         | p           | NULL               | NULL             |
+--------------+------------+-------------+--------------------+------------------+

Aktives Schema oder Datenbank prüfen

Mit der folgenden Anweisung können Sie die Details für das aktive Schema oder die aktive Datenbank prüfen.

SELECT TABLE_SCHEMA, TABLE_NAME, CCSA.CHARACTER_SET_NAME AS DEFAULT_CHAR_SET,
       COLUMN_NAME, COLUMN_TYPE, C.CHARACTER_SET_NAME
FROM information_schema.TABLES AS T
JOIN information_schema.COLUMNS AS C USING (TABLE_SCHEMA, TABLE_NAME)
JOIN information_schema.COLLATION_CHARACTER_SET_APPLICABILITY AS CCSA
ON (T.TABLE_COLLATION = CCSA.COLLATION_NAME)
WHERE TABLE_SCHEMA=SCHEMA()
AND C.DATA_TYPE IN ('enum', 'varchar', 'char', 'text', 'mediumtext', 'longtext', 'set' )
ORDER BY TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME;

Beispielausgabe:

+------------+
| DATABASE() |
+------------+
| test3      |
+------------+
+--------------+------------+------------------+-------------+-------------+--------------------+
| TABLE_SCHEMA | TABLE_NAME | DEFAULT_CHAR_SET | COLUMN_NAME | COLUMN_TYPE | CHARACTER_SET_NAME |
+--------------+------------+------------------+-------------+-------------+--------------------+
| test3        | t3         | utf16            | summary     | text        | utf16              |
+--------------+------------+------------------+-------------+-------------+--------------------+

Konfiguration der gespeicherten Prozeduren prüfen

Verwenden Sie die folgende Anweisung, um die Werte für gespeicherte Prozeduren zu prüfen:

SHOW PROCEDURE STATUS WHERE db = 'DB_NAME';

Ersetzen Sie DB_NAME durch den Namen der Datenbank.

Beispielausgabe:

+-------+------+-----------+---------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| Db    | Name | Type      | Definer | Modified            | Created             | Security_type | Comment | character_set_client | collation_connection | Database Collation |
+-------+------+-----------+---------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| test2 | p1   | PROCEDURE | root@%  | 2024-08-09 11:47:05 | 2024-08-09 11:47:05 | DEFINER       |         | utf8mb4              | utf8mb4_0900_ai_ci   | latin1_swedish_ci  |
| test2 | p2   | PROCEDURE | root@%  | 2024-08-09 11:48:36 | 2024-08-09 11:48:36 | DEFINER       |         | utf8mb4              | utf8mb4_0900_ai_ci   | latin1_swedish_ci  |
+-------+------+-----------+---------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+

Verwenden Sie die folgende Anweisung, um die Definition einer gespeicherten Prozedur abzurufen:

SHOW CREATE PROCEDURE DB_NAME.SP_NAME;

Ersetzen Sie Folgendes:

  • DB_NAME: Der Name der MySQL-Datenbank
  • SP_NAME: der Name der gespeicherten Prozedur

Wenn in einer gespeicherten Prozedur nicht der gewünschte Wert für den Zeichensatz oder die Sortierung verwendet wird, müssen Sie sie möglicherweise löschen und mit dem neuen Zeichensatz oder der neuen Sortierung neu erstellen.

Zuordnung der Datenbanksortierung prüfen

In der vorherigen Beispielausgabe wird die gespeicherte Prozedur mit latin1_swedish_ci als Standardsortierung und dem entsprechenden Zeichensatz latin1 erstellt. Das bedeutet, dass die gesamte Verarbeitung mit dem Zeichensatz latin1 erfolgt, es sei denn, bestimmte Parameter der Prozedur sind mit einem benutzerdefinierten Zeichensatz getaggt. Wenn Sie den Zeichensatz und die Sortierung nur auf Datenbankebene ändern, wird die gespeicherte Prozedur nicht automatisch durch die Aktualisierung auf Datenbankebene aktualisiert. Die Prozedur wird weiterhin mit dem Zeichensatz latin1 und der entsprechenden Sortierung ausgeführt. Wenn Sie die gespeicherte Prozedur löschen und neu erstellen, werden der neue Zeichensatz und die neue Sortierung der Datenbank verwendet, die Sie gerade aktualisiert haben.

Die Zuordnung zwischen Sortierung und Zeichensatz einer Datenbank können Sie durch Abfragen der Tabelle information_schema.COLLATION_CHARACTER_SET_APPLICABILITY ermitteln.

Verwenden Sie als Beispiel die folgende Anweisung:

SELECT CHARACTER_SET_NAME
FROM information_schema.COLLATION_CHARACTER_SET_APPLICABILITY
WHERE COLLATION_NAME = (SELECT database_collation FROM information_schema.ROUTINES
                        WHERE ROUTINE_SCHEMA = "test2" and ROUTINE_NAME = "p1");

Beispielausgabe:

+--------------------+
| CHARACTER_SET_NAME |
+--------------------+
| latin1             |
+--------------------+

Konfiguration der Trigger prüfen

Verwenden Sie die folgende Anweisung als Beispiel, um die Werte für Trigger zu prüfen.

SHOW TRIGGERS FROM DB_NAME;

Ersetzen Sie DB_NAME durch den Namen der MySQL-Datenbank.

Die Definition eines Triggers wird in der folgenden Beispielanweisung angezeigt.

SHOW CREATE trigger DB_NAME.TRIGGER_NAME;

Ersetzen Sie Folgendes:

  • DB_NAME: Der Name der MySQL-Datenbank
  • TRIGGER_NAME: der Name des Triggers

Wenn für den Trigger nicht der gewünschte Wert für den Zeichensatz oder die Sortierung verwendet wird, müssen Sie ihn möglicherweise löschen und mit dem neuen Zeichensatz oder der neuen Sortierung neu erstellen. Prüfen Sie, ob für den Trigger die richtige Datenbanksortierung zugeordnet ist. Weitere Informationen zum Prüfen der Datenbanksortierung finden Sie unter Zuordnung der Datenbanksortierung prüfen.

Konfiguration der Ereignisse prüfen

Verwenden Sie die folgende Anweisung als Beispiel, um die Werte für Ereignisse zu prüfen.

SHOW EVENTS FROM DB_NAME;

Ersetzen Sie DB_NAME durch den Namen der Datenbank.

Mit der folgenden Beispielanweisung können Sie die Definition eines Ereignisses abrufen.

SHOW CREATE EVENT DB_NAME.EVENT_NAME;

Ersetzen Sie Folgendes:

  • DB_NAME: Der name der Datenbank
  • EVENT_NAME: Der Name des Ereignisses

Wenn für das Ereignis nicht der gewünschte Wert für den Zeichensatz oder die Sortierung verwendet wird, müssen Sie es möglicherweise löschen und mit dem neuen Zeichensatz oder der neuen Sortierung neu erstellen. Prüfen Sie, ob für das Ereignis die richtige Datenbanksortierung zugeordnet ist. Weitere Informationen zum Prüfen der Datenbanksortierung finden Sie unter Zuordnung der Datenbanksortierung prüfen.

Konfiguration der Funktionen prüfen

Verwenden Sie die folgende Anweisung als Beispiel, um die Werte für Funktionen zu prüfen.

SHOW FUNCTION STATUS WHERE db = 'DB_NAME';

Ersetzen Sie DB_NAME durch den Namen der Datenbank.

Mit der folgenden Beispielanweisung können Sie die Definition einer Funktion abrufen.

SHOW CREATE FUNCTION DB_NAME.FUNCTION_NAME;

Ersetzen Sie Folgendes:

  • DB_NAME: Der Name der MySQL-Datenbank
  • FUNCTION_NAME: Der Name der Funktion

Wenn für die Funktion nicht der gewünschte Wert für den Zeichensatz oder die Sortierung verwendet wird, müssen Sie sie möglicherweise löschen und mit dem neuen Zeichensatz oder der neuen Sortierung neu erstellen. Prüfen Sie, ob für die Funktion die richtige Datenbanksortierung zugeordnet ist. Weitere Informationen zum Prüfen der Datenbanksortierung finden Sie unter Zuordnung der Datenbanksortierung prüfen.

Zeichensatz oder Sortierung: Prüfen Sie, ob für die Funktion die richtige Datenbanksortierung zugeordnet ist. Weitere Informationen zum Prüfen der Datenbanksortierung finden Sie unter Zuordnung der Datenbanksortierung prüfen.

Bestimmen, auf welcher Ebene aktualisiert werden soll

Nachdem Sie die Konfiguration des Zeichensatzes und der Sortierung Ihrer Datenbank geprüft haben, haben Sie eine Liste der Datenbanken und möglicherweise eine Liste der Datenbankobjekte, die Sie aktualisieren müssen.

Die Anzahl der Aufgaben, die Sie ausführen müssen, hängt vom Typ der Datenbankobjekte ab, für die Konfigurationsänderungen erforderlich sind.

Instanz sichern

Bevor Sie eines dieser Updates ausführen, sollten Sie eine Sicherung Ihrer Instanz erstellen. Weitere Informationen finden Sie unter On-Demand-Sicherung erstellen. Wir empfehlen, die Sicherung zu erstellen, wenn keine DDL-Vorgänge auf der Instanz ausgeführt werden.

Befehle zum Neuaufbau der gespeicherten Datenbankobjekte in Ihrer Datenbank generieren

Wenn Sie gespeicherte Datenbankobjekte in Ihren Datenbanken mit dem neuen Zeichensatz und der neuen Sortierung löschen und neu erstellen müssen, generieren Sie die Befehle jetzt mit dem Tool mysqldump. Nachdem Sie Ihre Datenbank und Tabellenspalten aktualisiert haben, verwenden Sie die generierte mysqldump-Datei, um die gespeicherten Datenbankobjekte in Ihrer Datenbank neu zu erstellen. Dieser Befehl generiert Anweisungen für alle gespeicherten Prozeduren, Funktionen, Trigger und Ereignisse.

Führen Sie den folgenden Befehl aus, damit Sie die Ausgabe später verwenden können, um alle gespeicherten Prozeduren, Funktionen und Ereignisse einer bestimmten Datenbank neu zu erstellen (wenn Sie gespeicherte Datenbankobjekte neu erstellen).

$ mysqldump -uDBAuser -p -h IP_ADDRESS \
   -P 3306 DB_NAME --no-data --no-create-db \
   --no-create-info --routines --triggers --events \
   --set-gtid-purged=OFF --events > dump_objects.sql

Ersetzen Sie Folgendes:

  • IP_ADDRESS: IP-Adresse der Cloud SQL for MySQL-Instanz
  • DB_NAME: Der Name der MySQL-Datenbank

Datenbanken und gegebenenfalls Tabellen und Spalten aktualisieren

In diesem Schritt aktualisieren Sie die Zeichensatz- und Sortierungswerte Ihrer Datenbanken. Möglicherweise müssen Sie auch Ihre Tabellen und Spalten neu erstellen.

Aktualisierungen auf Datenbankebene

Wenn Sie nur Aktualisierungen auf Datenbankebene ausführen, führen Sie die folgende Anweisung aus, um Ihre Datenbank zu aktualisieren:

ALTER DATABASE DB_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;

Ersetzen Sie Folgendes:

  • DB_NAME: Der Name der Datenbank, die aktualisiert werden soll
  • NEW_CHARSET: Der neue Zeichensatz, der auf die Datenbank angewendet werden soll
  • NEW_COLLATION: Die neue Sortierung, die auf die Datenbank angewendet werden soll

Aktualisierungen auf Datenbank- und Tabellenebene

Wenn Sie Aktualisierungen auf Datenbank- und Tabellenebene ausführen, gehen Sie so vor:

  1. Führen Sie die folgende Anweisung aus, um Ihre Datenbank zu aktualisieren:

    ALTER DATABASE DB_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;

    Ersetzen Sie Folgendes:

    • DB_NAME: Der Name der Datenbank, die aktualisiert werden soll
    • NEW_CHARSET: Der neue Zeichensatz, der auf die Datenbank angewendet werden soll
    • NEW_COLLATION: Die neue Sortierung, die auf die Datenbank angewendet werden soll
  2. Führen Sie für jede Tabelle, die Sie aktualisieren möchten, die folgende Anweisung aus:

    ALTER TABLE TABLE_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;

    Ersetzen Sie Folgendes:

    • TABLE_NAME: Der Name der Tabelle, die aktualisiert werden soll
    • NEW_CHARSET: Der neue Zeichensatz, der auf die Tabelle angewendet werden soll
    • NEW_COLLATION: Die neue Sortierung, die auf die Tabelle angewendet werden soll

Aktualisierungen auf Datenbank-, Tabellen- und Spaltenebene

Auf dieser Ebene müssen Sie vorhandene Daten neu codieren, damit sie den neuen Zeichensatz- und Sortierungseinstellungen entsprechen. Wenn Sie Aktualisierungen auf Datenbank-, Tabellen- und Spaltenebene ausführen, gehen Sie so vor:

  1. Bevor Sie mit der Aktualisierung der Tabellenspalten fortfahren, sollten Sie die folgenden Punkte beachten:

    • Die Zeichensatz- und Sortierungskonvertierung ALTER TABLE führt dazu, dass die Tabelle neu erstellt und gesperrt wird. Daher werden alle aktiven Abfragen, die versuchen, auf die Tabelle zuzugreifen, blockiert.
    • Die Umwandlung des Zeichensatzes und der Sortierung mit ALTER TABLE beansprucht etwas Zeit, da die gesamte Tabelle in den Arbeitsspeicher geladen wird. Dieser Vorgang kann die Latenz parallel ausgeführter Arbeitslasten erhöhen, da die Seiten des Zwischenspeicherpools für die aktualisierte Tabelle verwendet werden.
    • Wenn Abfragen auf mehrere Tabellen zugreifen und einige der Tabellen aktualisiert werden, während andere noch nicht aktualisiert wurden, können die Abfragen während dieser Transaktionszeit inkonsistente Ergebnisse liefern.
    • Wenn Sie eine Zeichensatz- und -Sortierungskonvertierung ALTER TABLE ausführen, wird eine zusätzliche Tabelle (sogenannte Schattentabelle) erstellt. Planen Sie die Laufwerknutzung entsprechend.
    • Durch die Konvertierung des Zeichensatzes und der Sortierung mit ALTER TABLE werden auch alle Indexe für die Tabelle neu erstellt.
    • Sie müssen die Replikatinstanzen nicht separat aktualisieren. Die Befehle ALTER, DROP und CREATE werden automatisch repliziert. Wenn Sie jedoch DDL-Befehle ausführen, kann sich die Replikationsverzögerung während des Vorgangs verlängern.
    • Wenn Sie eine der Datenbanken aus einer Sicherung wiederherstellen, die vor der Anwendung dieser Updates erstellt wurde, müssen Sie die Updates noch einmal anwenden.
  2. Prüfen Sie Ihre Tabelle auf Datentupel, die möglicherweise nicht mit dem neuen Zeichensatz kompatibel sind. Wenn es Inkompatibilitäten gibt, müssen Sie diese beheben, bevor Sie den Zeichensatz aktualisieren. Andernfalls treten während der Konvertierung Fehler auf. Mit der folgenden SELECT CONVERT-Anweisung können Sie Ihre Daten mit dem neuen Zeichensatz validieren.

    SELECT COLUMN_NAME,CONVERT(COLUMN_NAME USING NEW_CHARSET)
    FROM TABLE_NAME
    WHERE COLUMN_NAME != CONVERT(COLUMN_NAME USING NEW_CHARSET);
    SELECT c,CONVERT(c USING 'ascii')
    FROM t WHERE c != CONVERT(c USING ascii);
    

    Beispielausgabe:

    +------+--------------------------+
    | c    | convert(c using 'ascii') |
    +------+--------------------------+
    | é    | ?                        |
    | é    | ?                        |
    | £    | ?                        |
    +------+--------------------------+
    

    In diesem Beispiel werden in der Ausgabe drei Tupel zurückgegeben. Es gibt also drei inkonsistente Werte, die korrigiert werden müssen. Bevor Sie mit dem nächsten Schritt fortfahren, prüfen Sie die Ausgabe Ihrer Abfrage und korrigieren Sie die Daten, bis die Abfrage für alle Spalten, die konvertiert werden müssen, null Tupel zurückgibt. Sie können auch mehrere Spalten in derselben SELECT-Abfrage kombinieren.

  3. Wählen Sie eine Option zum Aktualisieren des Zeichensatzes und der Sortierung für Ihre Tabellen auf Spaltenebene aus.

  4. Wenn Sie den Zeichensatz für eine bestimmte Tabellenspalte aktualisieren möchten, folgen Sie der Anleitung auf dem Tab „Spaltenebene“. Dort müssen Sie nur die ausgewählten Spalten neu codieren. Andernfalls folgen Sie der Anleitung auf dem Tab „Tabellenebene“, um die gesamte Tabelle neu zu codieren.

    Tabellenebene

    1. Führen Sie die folgende Anweisung aus, um Ihre Datenbank zu aktualisieren:

      ALTER DATABASE DB_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;

      Ersetzen Sie Folgendes:

      • DB_NAME: Der Name der Datenbank, die aktualisiert werden soll
      • NEW_CHARSET: Der neue Zeichensatz, der auf die Datenbank angewendet werden soll
      • NEW_COLLATION: Die neue Sortierung, die auf die Datenbank angewendet werden soll
    2. Führen Sie für jede betroffene Tabelle die folgende Anweisung aus, um die Tabelle zu aktualisieren:

      ALTER TABLE TABLE_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;

      Ersetzen Sie Folgendes:

      • TABLE_NAME: Der Name der Tabelle, die aktualisiert werden soll
      • NEW_CHARSET: Der neue Zeichensatz, der auf die Tabelle angewendet werden soll
      • NEW_COLLATION: Die neue Sortierung, die auf die Tabelle angewendet werden soll
    3. Aktualisieren Sie die Tabelle auf Tabellenebene, damit alle Spalten der Tabelle mit dem neuen Zeichensatz und der neuen Sortierung aktualisiert werden. Mit dieser Option wird die Tabelle vollständig neu erstellt. Führen Sie zum Verwenden dieser Option den folgenden Befehl aus:

      ALTER TABLE DB_NAME.TABLE_NAME
      CONVERT TO CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;

      Ersetzen Sie Folgendes:

      • TABLE_NAME: Der Name der Tabelle, die aktualisiert werden soll
      • NEW_CHARSET: Der neue Zeichensatz, der auf die Tabelle angewendet werden soll
      • NEW_COLLATION: Die neue Sortierung, die auf die Tabelle angewendet werden soll

    Spaltenebene

    Aktualisierung auf Spaltenebene: Bei dieser Option wird die Tabelle ebenfalls vollständig neu erstellt. Wenn mehrere Spalten aktualisiert werden, kann diese Option zu mehreren Neuerstellungen führen.

    Führen Sie zum Verwenden dieser Option den folgenden Befehl aus:

    1. Führen Sie die folgende Anweisung aus, um Ihre Datenbank zu aktualisieren:
    2. ALTER DATABASE DB_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;

      Ersetzen Sie Folgendes:

      • DB_NAME: Der Name der Datenbank, die aktualisiert werden soll
      • NEW_CHARSET: Der neue Zeichensatz, der auf die Datenbank angewendet werden soll
      • NEW_COLLATION: Die neue Sortierung, die auf die Datenbank angewendet werden soll
    3. Führen Sie für jede betroffene Tabelle die folgende Anweisung aus, um die Tabelle zu aktualisieren:
    4. ALTER TABLE TABLE_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;
       

      Ersetzen Sie Folgendes:

      • TABLE_NAME: Der Name der Tabelle, die aktualisiert werden soll
      • NEW_CHARSET: Der neue Zeichensatz, der auf die Tabelle angewendet werden soll
      • NEW_COLLATION: Die neue Sortierung, die auf die Tabelle angewendet werden soll
    5. Führen Sie die folgende Anweisung aus, um die Daten auf Spaltenebene zu aktualisieren:
    6. ALTER TABLE DB_NAME.TABLE_NAME
      MODIFY COLUMN_DEFINITION CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;

      Ersetzen Sie Folgendes:

      • DB_NAME: Der Name der Datenbank, die aktualisiert werden soll
      • TABLE_NAME: Der Name der Tabelle, die aktualisiert werden soll
      • COLUMN_DEFINITION: Geben Sie eine genaue Spaltendefinition mit Einschränkungen an. Die Spaltendefinition enthält möglicherweise die alten Werte für den Zeichensatz und die Sortierung. Sie müssen die Spaltendefinition mit den neuen Werten aktualisieren
      • NEW_CHARSET: Der neue Zeichensatz, der auf die Tabellenspalte angewendet werden soll
      • NEW_COLLATION: Die neue Sortierung, die auf die Tabellenspalte angewendet werden soll

      Wiederholen Sie diese Anweisung für alle String-Spalten in der Tabelle, für die ein Zeichensatz oder eine Sortierung aktualisiert werden muss.

Aktualisierungen prüfen und nach Fehlern suchen

Achten Sie während des Vorgangs ALTER TABLE auf Fehler, die darauf hinweisen, dass vorhandene Daten in der Tabelle nicht mit dem neuen Zeichensatz kompatibel sind. Beispiel:

ERROR 1366 (HY000): Incorrect string value: '\xC3\xA9' for column 'c' at row 1

Wenn Datenkompatibilitätsfehler auftreten, sollten Sie Ihre Tabellen noch einmal auf Datenkompatibilitätsfehler prüfen und diese beheben, bevor Sie die ALTER TABLE-Anweisungen noch einmal ausführen, um die Daten neu zu codieren.

Außerdem kann während des ALTER TABLE-Vorgangs bei den Tabellen (der Tabelle mit dem Fremdschlüssel und der referenzierten Tabelle) eine Fremdschlüsselprüfung fehlschlagen, während die Spalte neu codiert wird. In diesem Fall können Sie die Fremdschlüsselprüfung (SET FOREIGN_KEY_CHECKS=0;) deaktivieren und die Aktualisierung noch einmal ausführen.

Gespeicherte Datenbankobjekte neu erstellen

Nachdem Sie Ihre Datenbank erfolgreich aktualisiert haben, können Sie die gespeicherten Datenbankobjekte mit den Zeichensatz- und Sortierungswerten mithilfe der generierten mysqldump-Datei neu erstellen.

So erstellen Sie Ihre gespeicherten Datenbankobjekte neu:

  1. Prüfen Sie, ob die gespeicherten Datenbankobjekte in der Datenbank vorhanden sind.
  2. Achten Sie darauf, dass keine parallele Auslastung vorliegt, für die die gespeicherten Datenbankobjekte während dieses Zeitraums vorhanden sein müssen.
  3. Die mysqldump-Datei, die Sie mit dem mysqldump-Tool generiert haben, enthält nicht die Anweisung zum Entfernen von Triggern. Wenn Sie Trigger löschen möchten, öffnen Sie ein MySQL-Terminal, um die DROP-Anweisung für Trigger zu generieren.

    mysql> SELECT CONCAT('DROP TRIGGER ', TRIGGER_NAME, ';') AS
    drop_trigger_statements FROM information_schema.TRIGGERS
    WHERE TRIGGER_SCHEMA = DB_NAME;
  4. Kopieren Sie die Ausgabe.

  5. Führen Sie die Anweisung aus, um die Trigger für Ihre Datenbank zu löschen, entweder in einer MySQL-Shell oder in einem Script.

  6. Nachdem Sie die Trigger gelöscht haben, wenden Sie die Dumpdatei an, die Sie mit dem Tool mysqldump generiert haben. Geben Sie Folgendes ein, um die Dumpdatei anzuwenden und die Objekte neu zu erstellen:

    $ mysql -uDBAuser -p -h IP_ADDRESS \
      -P 3306 DB_NAME < dump_objects.sql

    Ersetzen Sie Folgendes:

    • IP_ADDRESS: IP-Adresse der Cloud SQL for MySQL-Instanz
    • DB_NAME: Der name der Datenbank

Weitere Sicherung der Instanz erstellen

Erstellen Sie nach Abschluss der Updates eine weitere Sicherung Ihrer Instanz. Weitere Informationen finden Sie unter On-Demand-Sicherung erstellen.

Beispielskripte

Wenn Sie Datenbanken, Tabellen und Spalten aktualisieren müssen, finden Sie in diesem Abschnitt Beispielscripts, mit denen Sie Ihre Daten neu codieren können.

Script zum Aktualisieren mehrerer Tabellen

Das folgende Script generiert eine Anweisung für alle Tabellen in der angegebenen Datenbank. Mit der Anweisung können Sie vorhandene Daten neu codieren, damit sie den neuen Zeichensatz- und Sortierungseinstellungen entsprechen.

SELECT CONCAT("ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;  ",
"ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," CONVERT TO CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION; ")
AS alter_sql FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'DB_NAME' AND TABLE_TYPE='BASE TABLE';

Ersetzen Sie Folgendes:

  • DB_NAME: Der Name der Datenbank, die aktualisiert werden soll
  • NEW_CHARSET: Der neue Zeichensatz, der auf die Tabelle angewendet werden soll
  • NEW_COLLATION: Die neue Sortierung, die auf die Tabelle angewendet werden soll

Beispielausgabe:

+--------------------------------------------------------------------------------------------+
|alter_sql
+--------------------------------------------------------------------------------------------+
| ALTER TABLE test1.t1 CHARACTER SET <new-charset> COLLATE <new-collation>;
  ALTER TABLE test1.t1 CONVERT TO CHARACTER SET <new-charset> COLLATE <new-collation>;       |
+--------------------------------------------------------------------------------------------+

Script zum Aktualisieren mehrerer Spalten in einer Tabelle

Das folgende Script generiert eine Anweisung für alle Spalten in einer bestimmten Tabelle. Mit der Anweisung können Sie vorhandene Daten neu codieren, damit sie den neuen Zeichensatz- und Sortierungseinstellungen entsprechen.

  1. ALTER TABLE-Anweisungen für alle Tabellen in der Datenbank generieren

    SELECT CONCAT("ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;  ")
    AS alter_table_statements
    FROM information_schema.TABLES
    WHERE TABLE_SCHEMA = 'DB_NAME' AND TABLE_TYPE='BASE TABLE';

    Ersetzen Sie Folgendes:

    • DB_NAME: Der Name der Datenbank, die aktualisiert werden soll
    • NEW_CHARSET: Der neue Zeichensatz, der auf die Tabelle angewendet werden soll
    • NEW_COLLATION: Die neue Sortierung, die auf die Tabelle angewendet werden soll

    Beispielausgabe:

    +------------------------------------------------------------------------------+
    | alter_table_statements                                                       |
    +------------------------------------------------------------------------------+
    | ALTER TABLE test1.t1 CHARACTER SET <new-charset> COLLATE <new-collation>;    |
    +------------------------------------------------------------------------------+
    
  2. Erstellen Sie für jede Tabelle ALTER TABLE MODIFY-Befehle.

    SELECT CONCAT( "ALTER TABLE ", table_name, " MODIFY ", column_name, 'COLUMN_DEFINITION' , " CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION ")
    AS alter_table_column_statements FROM information_schema.columns
    WHERE table_schema = 'DB_NAME' AND table_name = 'TABLE_NAME'
    AND data_type IN ('char', 'varchar', 'tinytext', 'text', 'mediumtext', 'longtext','set','enum');

    Ersetzen Sie Folgendes:

    • DB_NAME: Der Name der Datenbank, die aktualisiert werden soll
    • TABLE_NAME: Der Name der Tabelle, die aktualisiert werden soll
    • COLUMN_DEFINITION: Nachdem Sie Ergebnisse aus jeder Abfrage erhalten haben, ersetzen Sie sie durch die Spaltendefinition für jede Spalte. Die Spaltendefinitionen können sich von Spalte zu Spalte unterscheiden.
    • NEW_CHARSET: Der neue Zeichensatz, der auf die Tabellenspalte angewendet werden soll
    • NEW_COLLATION: Die neue Sortierung, die auf die Tabellenspalte angewendet werden soll

    Beispielausgabe:

    +-------------------------------------------------------------------------------------------------------------------------------------+
    |alter_table_column_statements                                                                                                        |
    +-------------------------------------------------------------------------------------------------------------------------------------+
    | ALTER TABLE t1 MODIFY c <column-definition-replaced-after-obtaining-result-set> CHARACTER SET <new-charset> COLLATE <new-collation>  |
    +-------------------------------------------------------------------------------------------------------------------------------------+
    

Nächste Schritte