Wie konvertiere ich einen gesamten MySQL-Datenbank-Zeichensatz und eine Sortierung in UTF-8?

459

Wie kann ich den gesamten MySQL-Datenbankzeichensatz in UTF-8 und die Sortierung in UTF-8 konvertieren?

Dean
quelle
22
Für spätere Besucher: Beachten Sie die zugehörigen Fragen in der Seitenleiste und verwenden Sie diese utf8_unicode_cinicht utf8_general_ci.
Fuxia
14
Wenn Sie die volle UTF-8 - Unterstützung wollen Sie wahrscheinlich wollen auch einen Zeichensatz verwenden , utf8mb4als vielmehr utf8als utf8nur die Grund mehrsprachiger Ebene unterstützt als das gesamte Spektrum gegenüber . Es erfordert MySQL 5.5.3 oder höher.
Martin Steel
4
Ich habe vergessen, in meinem Kommentar oben zu erwähnen, wenn Sie zu wechseln, müssen utf8mb4Sie auch die Sortierung aufutf8mb4_unicode_ci
Martin Steel
3
Noch besser, Sortierung utf8mb4_unicode_520_cioder was auch immer die neueste verfügbare Version ist.
Rick James
@MartinSteel Ich glaube, das ist die Standardkollation mit diesem Zeichensatz.
VaTo

Antworten:

715

Verwenden Sie die Befehle ALTER DATABASEund ALTER TABLE.

ALTER DATABASE databasename CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Oder wenn Sie noch mit MySQL 5.5.2 oder älter arbeiten, das 4-Byte-UTF-8 nicht unterstützt, verwenden Sie utf8anstelle von utf8mb4:

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
BalusC
quelle
12
Bei dieser CONVERT TOTechnik wird davon ausgegangen, dass der Text in einem anderen Zeichensatz (z. B. latin1) korrekt gespeichert und nicht entstellt wurde (z. B. UTF-8-Bytes, die ohne Konvertierung in latin1 in die Spalte latin1 gepackt wurden).
Rick James
1
Dadurch wird der Tisch neu aufgebaut und auf großen Produktionssystemen nicht mehr realisierbar. Wenn sicher ist, dass nur ASCII-Zeichen in den Spalten latin1 gespeichert sind, ist es möglich, den Zeichensatz / die Sortierung der Tabelle zu ändern, ohne sie neu zu erstellen?
Andrew
@ Andrew Große Produktionssysteme haben normalerweise eine gespiegelte Datenbank für die Wartung.
BalusC
1
Durch Ändern des Zeichensatzes auf utf8 wird mein Datentyp von Text in Mediumtext geändert. Wird es erwartet?
Jerry
1
@Jerry Wahrscheinlich seit: "Wenn die Spalte in utf8 konvertiert wird, benötigt jedes Zeichen möglicherweise bis zu drei Bytes für eine maximal mögliche Länge von 3 × 65.535 = 196.605 Bytes. Diese Länge passt also nicht in die Längenbytes einer TEXT-Spalte MySQL konvertiert den Datentyp in MEDIUMTEXT. Dies ist der kleinste Zeichenfolgentyp, für den die Längenbytes einen Wert von 196.605 aufzeichnen können. Ebenso kann eine VARCHAR-Spalte in MEDIUMTEXT konvertiert werden. " Ändern des Zeichensatzes
Jabbascript
129
  1. Mach ein Backup!

  2. Dann müssen Sie die Standardzeichensätze in der Datenbank festlegen. Dadurch werden vorhandene Tabellen nicht konvertiert, sondern nur die Standardeinstellungen für neu erstellte Tabellen festgelegt.

    ALTER DATABASE dbname CHARACTER SET utf8 COLLATE utf8_general_ci;
  3. Anschließend müssen Sie den Zeichensatz für alle vorhandenen Tabellen und deren Spalten konvertieren. Dies setzt voraus, dass sich Ihre aktuellen Daten tatsächlich im aktuellen Zeichensatz befinden. Wenn Ihre Spalten auf einen Zeichensatz festgelegt sind, Ihre Daten jedoch tatsächlich in einem anderen gespeichert sind, müssen Sie im MySQL-Handbuch nachlesen, wie Sie damit umgehen sollen.

    ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
Zeitung
quelle
44
Hinweis: ALTER TABLE Tabellenname CHARACTER SET utf8 legt nur den Standardzeichensatz für eine Tabelle fest, die für neu erstellte Spalten verwendet wird. Vorhandene Spalten, für die bereits ein Zeichensatz festgelegt wurde, werden nicht konvertiert.
Zeitung
Ich hätte zuerst das Backup Backup Backup lesen sollen ... aber mein Glück war, dass es sich in einer Entwicklungsumgebung befand. Also geht meine Gegenstimme an dich!
DominikAngerer
4
@ DominikAngerer: Was ist kaputt gegangen?
cic
16
Beachten Sie, dass dies utf8_general_cinicht mehr als bewährte Methode empfohlen wird. Seit MySQL 5.5.3 sollten Sie utf8mb4eher als verwenden utf8. Beide beziehen sich auf die UTF-8-Codierung, aber die älteren utf8hatten eine MySQL-spezifische Einschränkung, die die Verwendung der oben nummerierten Zeichen verhinderte 0xFFFD.
u01jmg3
76

Auf der Kommandozeilen-Shell

Wenn Sie eine der Befehlszeilen-Shell sind, können Sie dies sehr schnell tun. Geben Sie einfach "Datenbankname" ein: D.

DB="dbname"
(
    echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'
    mysql "$DB" -e "SHOW TABLES" --batch --skip-column-names \
    | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;'
) \
| mysql "$DB"

Einzeiler zum einfachen Kopieren / Einfügen

DB="dbname"; ( echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'; mysql "$DB" -e "SHOW TABLES" --batch --skip-column-names | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;' ) | mysql "$DB"
Arnold Daniels
quelle
2
Können Sie mehr Details in diese ich bekommeERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DB="dbname"
Steros
@ 4485670 Sie müssen dies in der Befehlszeilen-Shell ausführen . Wenn Sie nur die MySQL-Client-Verbindung zur Verfügung haben, verwenden Sie den folgenden Code von sdfor.
Arnold Daniels
6
Dieser Code funktioniert hervorragend. Denken Sie daran, nach mysql nach Bedarf -h [Hostname] -u [Benutzername] -p [Passwort] hinzuzufügen.
zerstreuen
3
Sie möchten wahrscheinlich die Fremdschlüsselprüfung auf einem realen System deaktivieren: DB="db_name"; ( echo 'ALTER DATABASE '"$ DB"' `CHARACTER SET utf8 COLLATE utf8_general_ci; '; mysql --uuser -ppassword -hhost "$ DB" -e "SHOW TABLES" --batch --skip-column-names | xargs -I {} echo 'SET alien_key_checks = 0; ALTER TABLE '{}'CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; ' ) | mysql -uuser -ppassword -hhost "$ DB" `
Adam Nelson
1
Hat bei mir nicht funktioniert, bis ich "show full tables where Table_Type = 'BASE TABLE'" anstelle von "SHOW TABLES" verwendet habe
Brian Peterson
68

Sie können die SQL erstellen, um alle Tabellen zu aktualisieren mit:

SELECT CONCAT("ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," CHARACTER SET utf8 COLLATE utf8_general_ci;   ",
    "ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  ") 
    AS alter_sql
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = your_database_name;

Erfassen Sie die Ausgabe und führen Sie sie aus.

Die Antwort von Arnold Daniels oben ist eleganter.

sdfor
quelle
Warum haben Sie zwei Alter Table-Abfragen hinzugefügt? man reicht nicht aus
Akshay
7
@ Akshay, gute Frage. Die erste Abfragetabellenabfrage legt den Standard für neue Spalten fest, und die zweite Abfragetabellenabfrage konvertiert die vorhandenen Spalten.
UnlimitedInfinity
4
Zu Ihrer Information : Laut dev.mysql.com/doc/refman/5.5/en/alter-table.html MySQL-Dokumentation führt die Version "CONVERT TO CHARACTER SET" der ALTER-Anweisung beides in einem Schritt aus: "Ändern der Tabellenvorgabe Zeichensatz und alle Zeichenspalten (CHAR, VARCHAR, TEXT) zu einem neuen Zeichensatz ...
devGuy
2
Ich habe diesen Fehler # 1054 - Unbekannte Spalte 'webdb_playground' in 'where-Klausel', aber ich bin sicher, dass meine Datenbank die richtige ist
Yannis Dran
1
@YannisDran Ihr Datenbankname war möglicherweise nicht in einer Zeichenfolge enthalten, sodass WHERE TABLE_SCHEMA=webdb_playgroundSie den unbekannten Spaltenfehler erhalten WHERE TABLE_SCHEMA="webdb_playground"haben, aber erfolgreich gewesen wären. Etwas zu versuchen, falls jemand anderes darauf stößt.
Jabbascript
17

Bevor Sie fortfahren, stellen Sie sicher, dass Sie: eine vollständige Datenbanksicherung abgeschlossen haben!

Schritt 1: Änderungen auf Datenbankebene

  • Identifizieren der Sortierung und des Zeichensatzes Ihrer Datenbank

    SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM 
    information_schema.SCHEMATA S
    WHERE schema_name = 'your_database_name'
    AND
    (DEFAULT_CHARACTER_SET_NAME != 'utf8'
        OR
     DEFAULT_COLLATION_NAME not like 'utf8%');
  • Korrigieren der Sortierung für die Datenbank

    ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Schritt 2: Änderungen auf Tabellenebene

  • Identifizieren von Datenbanktabellen mit dem falschen Zeichensatz oder der falschen Sortierung

    SELECT CONCAT(
    'ALTER TABLE ',  table_name, ' CHARACTER SET utf8 COLLATE utf8_general_ci;  ', 
    'ALTER TABLE ',  table_name, ' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  ')
    FROM information_schema.TABLES AS T, information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` AS C
    WHERE C.collation_name = T.table_collation
    AND T.table_schema = 'your_database_name'
    AND
    (C.CHARACTER_SET_NAME != 'utf8'
        OR
     C.COLLATION_NAME not like 'utf8%')
  • Anpassen der Sortierung und des Zeichensatzes von Tabellenspalten

Erfassen Sie die obere SQL-Ausgabe und führen Sie sie aus. (wie folgt)

ALTER TABLE rma CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_history CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_history CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_products CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_products CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_report_period CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_report_period CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_reservation CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_reservation CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_supplier_return CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_supplier_return CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_supplier_return_history CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_supplier_return_history CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_supplier_return_product CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_supplier_return_product CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 

Siehe: https://confluence.atlassian.com/display/CONFKB/How+to+Fix+the+Collation+and+Character+Set+of+a+MySQL+Database

John Yin
quelle
1
Derzeit verwendet dieses Skript 'utf8_unicode_ci' für die Datenbank, aber 'utf8_general_ci' für die Tabellen - war das beabsichtigt? (Ich denke, beide sollten den gleichen Zeichensatz verwenden)
gmcnaughton
stackoverflow.com/questions/10957238/… haben hier eine ausführlichere Antwort hinterlassen
VH
8

Verwenden Sie HeidiSQL . Es ist kostenlos und ein sehr gutes DB-Tool.

Rufen Sie im Menü Extras den Bulk-Tabelleneditor auf

Wählen Sie die vollständige Datenbank aus oder wählen Sie die zu konvertierenden Tabellen aus.

  • Häkchen Standardkollatierung ändern: utf8mb4_general_ci
  • Häkchen In Zeichensatz konvertieren: utf8

Ausführen

Dadurch wird die gesamte Datenbank in wenigen Sekunden von Latin nach Utf8 konvertiert.

Klappt wunderbar :)

HeidiSQL stellt standardmäßig eine Verbindung als utf8 her, sodass Sonderzeichen jetzt als Zeichen (æ ø å) und nicht mehr als codiert bei der Überprüfung der Tabellendaten angesehen werden sollten.

Die eigentliche Gefahr beim Wechsel von Latin zu Utf8 besteht darin, sicherzustellen, dass pdo mit dem Zeichensatz utf8 verbunden ist. Wenn nicht, werden überall auf Ihrer Webseite Mülldaten in die utf8-Tabelle und Fragezeichen eingefügt, sodass Sie glauben, dass die Tabellendaten nicht utf8 sind ...

Tom
quelle
Könnten Sie bitte näher darauf eingehen? Ich habe genau dieses Problem - Sonderzeichen und Leerzeichen erscheinen als Fragezeichen. Ich versuche, die Datenbank in MAMP mit PHPMyAdmin zu konvertieren. Nachdem ich mich offline entwickelt habe, stelle ich jetzt fest, dass mein Host utf8mb4 nicht unterstützt. Ich habe kein Windows und kann daher HeidiSQL nicht verwenden. Gibt es eine Möglichkeit, dies mit PHPMyAdmin zu erreichen?
RexTheRunt
so. vor allem hast du viel tisch.
Tyan
Ich bekomme und Fehler beim Konvertieren des CHARSET: SQL-Fehlers (1025): Fehler beim Umbenennen ... aber dies ist ein erstaunliches SQL-Manager-Tool!
marcolopes
Wenn jemand einen guten Überblick und ein Tutorial für heidisql benötigt, lesen Sie diesen Artikel .
DougB
6

Inspiriert von @sdfor Kommentar, ist hier ein Bash-Skript, das die Arbeit erledigt

#!/bin/bash

printf "### Converting MySQL character set ###\n\n"

printf "Enter the encoding you want to set: "
read -r CHARSET

# Get the MySQL username
printf "Enter mysql username: "
read -r USERNAME

# Get the MySQL password
printf "Enter mysql password for user %s:" "$USERNAME"
read -rs PASSWORD

DBLIST=( mydatabase1 mydatabase2 )

printf "\n"


for DB in "${DBLIST[@]}"
do
(
    echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE `'"$CHARSET"'`;'
    mysql "$DB" -u"$USERNAME" -p"$PASSWORD" -e "SHOW TABLES" --batch --skip-column-names \
    | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE `'"$CHARSET"'`;'
) \
| mysql "$DB" -u"$USERNAME" -p"$PASSWORD"

echo "$DB database done..."
done

echo "### DONE ###"
exit
Camoflame
quelle
4

Falls sich die Daten nicht im selben Zeichensatz befinden, können Sie dieses Snippet von http://dev.mysql.com/doc/refman/5.0/en/charset-conversion.html in Betracht ziehen

Wenn die Spalte einen nicht-binären Datentyp (CHAR, VARCHAR, TEXT) hat, sollte ihr Inhalt im Spaltenzeichensatz und nicht in einem anderen Zeichensatz codiert werden. Wenn der Inhalt in einem anderen Zeichensatz codiert ist, können Sie die Spalte zuerst in einen binären Datentyp und dann in eine nicht-binäre Spalte mit dem gewünschten Zeichensatz konvertieren.

Hier ist ein Beispiel:

 ALTER TABLE t1 CHANGE c1 c1 BLOB;
 ALTER TABLE t1 CHANGE c1 c1 VARCHAR(100) CHARACTER SET utf8;

Stellen Sie sicher, dass Sie die richtige Sortierung auswählen, da sonst eindeutige Schlüsselkonflikte auftreten können. z. B. könnten Éleanore und Eleanore in einigen Zusammenstellungen als gleich angesehen werden.

Beiseite:

Ich hatte eine Situation, in der bestimmte Zeichen in E-Mails "kaputt gingen", obwohl sie als UTF-8 in der Datenbank gespeichert waren. Wenn Sie E-Mails mit utf8-Daten senden, möchten Sie möglicherweise auch Ihre E-Mails so konvertieren, dass sie in UTF8 gesendet werden.

Aktualisieren Sie in PHPMailer einfach diese Zeile: public $CharSet = 'utf-8';

Frank Forte
quelle
4

Für Datenbanken mit einer hohen Anzahl von Tabellen können Sie ein einfaches PHP-Skript verwenden, um den Zeichensatz der Datenbank und aller Tabellen wie folgt zu aktualisieren:

$conn = mysqli_connect($host, $username, $password, $database);

if ($conn->connect_error) {
  die("Connection failed: " . $conn->connect_error);
}

$alter_database_charset_sql = "ALTER DATABASE ".$database." CHARACTER SET utf8 COLLATE utf8_unicode_ci";
mysqli_query($conn, $alter_database_charset_sql);

$show_tables_result = mysqli_query($conn, "SHOW TABLES");
$tables  = mysqli_fetch_all($show_tables_result);

foreach ($tables as $index => $table) {
  $alter_table_sql = "ALTER TABLE ".$table[0]." CONVERT TO CHARACTER SET utf8  COLLATE utf8_unicode_ci";
  $alter_table_result = mysqli_query($conn, $alter_table_sql);
  echo "<pre>";
  var_dump($alter_table_result);
  echo "</pre>";
}
Dan Lucas
quelle
Woher führen wir dieses Skript aus?
Yannis Dran
1
@YannisDran Es sollte keine Rolle spielen, solange die IP, von der aus Sie es ausführen, Zugriff auf die Datenbank hat. Stellen Sie sicher, dass Sie zuerst ein Backup erstellen!
Dan Lucas
Gut, und wie machen wir das? Müssen wir es auf den Server hochladen und dann den Pfad zu seiner Position eingeben?
Yannis Dran
4
DELIMITER $$  

CREATE PROCEDURE `databasename`.`update_char_set`()  

BEGIN  
 DECLARE done INT DEFAULT 0;  
 DECLARE t_sql VARCHAR(256);  
 DECLARE tableName VARCHAR(128);  
 DECLARE lists CURSOR FOR SELECT table_name FROM `information_schema`.`TABLES` WHERE table_schema = 'databasename';  
 DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;  
 OPEN lists;  
 FETCH lists INTO tableName;  
 REPEAT  
    SET @t_sql = CONCAT('ALTER TABLE ', tableName, ' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci');  
    PREPARE stmt FROM @t_sql;  
    EXECUTE stmt;  
    DEALLOCATE PREPARE stmt;  
 FETCH lists INTO tableName;  
 UNTIL done END REPEAT;  
 CLOSE lists;  
END$$  

DELIMITER ;  

CALL databasename.update_char_set();
剑 二十 三
quelle
Vielen Dank, dies ist eine der wenigen Antworten, die tatsächlich zeigen, wie es mit der gesamten Datenbank (dh jeder Tabelle) gemacht wird. Lief wie am Schnürchen.
Machisuji
3
mysqldump -uusername -ppassword -c -e --default-character-set=utf8 --single-transaction --skip-set-charset --add-drop-database -B dbname > dump.sql
cp dump.sql dump-fixed.sql
vim dump-fixed.sql


:%s/DEFAULT CHARACTER SET latin1/DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci/
:%s/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/
:wq

mysql -uusername -ppassword < dump-fixed.sql
Soumik Guha
quelle
3

Am sichersten ist es, die Spalten zuerst in einen Binärtyp und dann mit dem gewünschten Zeichensatz wieder in diesen Typ zu ändern.

Jeder Spaltentyp hat seinen jeweiligen Binärtyp wie folgt:

  1. CHAR => BINARY
  2. TEXT => BLOB
  3. TINYTEXT => TINYBLOB
  4. MEDIUMTEXT => MEDIUMBLOB
  5. LONGTEXT => LONGBLOB
  6. VARCHAR => VARBINARY

Z.B.:

ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] MODIFY [COLUMN_NAME] VARBINARY;

ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] MODIFY [COLUMN_NAME] VARCHAR(140) CHARACTER SET utf8mb4;

Ich habe es in mehreren Latin1-Tabellen versucht und es wurden alle diakritischen Zeichen beibehalten.

Sie können diese Abfrage für alle Spalten extrahieren, die dies tun:

SELECT
CONCAT('ALTER TABLE ', TABLE_SCHEMA,'.', TABLE_NAME,' MODIFY ', COLUMN_NAME,' VARBINARY;'),
CONCAT('ALTER TABLE ', TABLE_SCHEMA,'.', TABLE_NAME,' MODIFY ', COLUMN_NAME,' ', COLUMN_TYPE,' CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;')
FROM information_schema.columns
WHERE TABLE_SCHEMA IN ('[TABLE_SCHEMA]')
AND COLUMN_TYPE LIKE 'varchar%'
AND (COLLATION_NAME IS NOT NULL AND COLLATION_NAME NOT LIKE 'utf%');

Nachdem Sie dies für alle Ihre Spalten getan haben, tun Sie dies für alle Tabellen:

ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

Verwenden Sie die folgende Abfrage, um diese Abfrage für alle Ihre Tabellen zu generieren:

SELECT
CONCAT('ALTER TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_COLLATION NOT LIKE 'utf8%'
and TABLE_SCHEMA in ('[TABLE_SCHEMA]');

Und jetzt, da Sie alle Ihre Spalten und Tabellen geändert haben, machen Sie dasselbe in der Datenbank:

ALTER DATABASE [DATA_BASE_NAME] CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci;
MalachiteBR
quelle
1

Wenn Sie Ihre Tabellen nicht zum Konvertieren bringen können oder Ihre Tabelle immer auf einen Nicht-utf8-Zeichensatz eingestellt ist, Sie aber utf8 möchten, ist es möglicherweise am besten, sie zu löschen und erneut zu beginnen und explizit anzugeben:

create database database_name character set utf8;
user3013048
quelle
0

Die einzige Lösung, die für mich funktioniert hat: http://docs.moodle.org/23/de/Converting_your_MySQL_database_to_UTF8

Konvertieren einer Datenbank mit Tabellen

mysqldump -uusername -ppassword -c -e --default-character-set=utf8 --single-transaction --skip-set-charset --add-drop-database -B dbname > dump.sql

cp dump.sql dump-fixed.sql
vim dump-fixed.sql

:%s/DEFAULT CHARACTER SET latin1/DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci/
:%s/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/
:wq

mysql -uusername -ppassword < dump-fixed.sql
utapyngo
quelle
0

alter table table_name charset = 'utf8';

Dies ist eine einfache Abfrage, die ich für meinen Fall verwenden konnte. Sie können den Tabellennamen gemäß Ihren Anforderungen ändern.

Aditya Seth
quelle
Normalerweise sollte eine Antwort von einer Erklärung begleitet sein, was Sie vorschlagen.
RiggsFolly
0

Geben Sie den folgenden Befehl an der Eingabeaufforderung mysql> ein, um die Zeichensatzcodierung für die Datenbank selbst in UTF-8 zu ändern. Ersetzen Sie DBNAME durch den Datenbanknamen:

ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;
Nyein Aung
quelle
0

Sie können auch das DB-Tool Navicat verwenden, was es einfacher macht.

  • Siva.

Klicken Sie mit der rechten Maustaste auf Ihre Datenbank und wählen Sie DB-Eigenschaften und ändern Sie sie wie gewünscht in Dropdown

Geben Sie hier die Bildbeschreibung ein

rvsiva17
quelle
0

Befehlszeilenlösung und Ansichten ausschließen

Ich vervollständige einfach die Antwort von @ Jasny für andere wie @Brianund ich, die Ansichten in unserer Datenbank haben.

Wenn Sie einen Fehler wie diesen haben:

ERROR 1347 (HY000) at line 17: 'dbname.table_name' is not of type 'BASE TABLE'

Dies liegt daran, dass Sie wahrscheinlich Ansichten haben und diese ausschließen müssen. Beim Versuch, sie auszuschließen, gibt MySQL 2 Spalten anstelle von 1 zurück.

SHOW FULL TABLES WHERE Table_Type = 'BASE TABLE';
-- table_name1  BASE TABLE
-- table_name2  BASE TABLE

Wir müssen also Jasnys Befehl anpassen awk, um nur die erste Spalte zu extrahieren, die den Tabellennamen enthält.

DB="dbname"
(
    echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'
    mysql "$DB" -e "SHOW FULL TABLES WHERE Table_Type = 'BASE TABLE'" --batch --skip-column-names \
    | awk '{print $1 }' \
    | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;'
) \
| mysql "$DB"

Einzeiler zum einfachen Kopieren / Einfügen

DB="dbname"; ( echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'; mysql "$DB" -e "SHOW FULL TABLES WHERE Table_Type = 'BASE TABLE'" --batch --skip-column-names | awk '{print $1 }' | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;' ) | mysql "$DB"
Natsimhan
quelle
-1

Befolgen Sie die einfachen Schritte in PHPMyAdmin, um die Zeichensatzcodierung in UTF-8 zu ändern

  1. Wählen Sie Ihre Datenbank aus SS

  2. Gehen Sie zu Operationen SS

  3. Wählen Sie auf der Registerkarte "Operationen" im unteren Dropdown-Menü "Sortierung" die gewünschte Codierung aus, z. B. (utf8_general_ci), und aktivieren Sie das Kontrollkästchen (1) Alle Tabellensortierungen ändern, (2) Alle Tabellenspaltenkollatierungen ändern. und drücke Go.

SS

Khuram treten
quelle