it-swarm.com.de

Wie konvertiere ich einen kompletten MySQL-Datenbankzeichensatz und eine Sortierung nach UTF-8?

Wie kann ich den gesamten Zeichensatz der MySQL-Datenbank in UTF-8 und die Sortierung in UTF-8 konvertieren?

430
Dean

Verwenden Sie die Befehle ALTER DATABASE und 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 immer noch mit MySQL 5.5.2 oder älter arbeiten, das 4-Byte-UTF-8 nicht unterstützt, verwenden Sie _utf8_ anstelle von _utf8mb4_:

_ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
_
667
BalusC
  1. Machen Sie 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 ihre 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 wirklich in einem anderen gespeichert sind, müssen Sie im MySQL-Handbuch nachlesen, wie Sie damit umgehen.

    ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
    
121
newspire

In der Kommandozeilen-Shell

Wenn Sie eine der Befehlszeilen-Shell sind, können Sie dies sehr schnell tun. Füllen Sie einfach "dbname" aus: 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"

Einzeilig 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"

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

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 ist eleganter.

68
sdfor

Stellen Sie vor dem Fortfahren sicher, dass Sie: eine vollständige Datenbanksicherung durchgeführt 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 der Tabellenebene

  • Identifizieren von Datenbanktabellen mit falschem Zeichensatz oder falscher 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 der 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

16
John Yin

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 komplette Datenbank aus oder wählen Sie die zu konvertierenden Tabellen aus.

  • häkchen Standardkollatierung ändern: utf8mb4_general_ci
  • tick In Zeichensatz konvertieren: utf8

Execute

Dies konvertiert die komplette Datenbank in wenigen Sekunden von lateinisch nach utf8.

Klappt wunderbar :)

HeidiSQL verbindet sich standardmäßig als utf8, daher sollten Sonderzeichen jetzt als Zeichen (æ ø å) und nicht als verschlüsselt angesehen werden, wenn die Tabellendaten überprüft werden.

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

7
Tom

Inspiriert von @sdfor comment ist hier ein Bash-Skript, das den Job 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
6
Camoflame

Für Datenbanken mit einer großen 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>";
}
4
Dan Lucas

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 hat (CHAR, VARCHAR, TEXT), sollte ihr Inhalt im Spaltenzeichensatz codiert werden, nicht in einem anderen Zeichensatz. Wenn der Inhalt in einem anderen Zeichensatz codiert ist, können Sie die Spalte zunächst 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 Kollatierung auswählen, da sonst möglicherweise eindeutige Schlüsselkonflikte auftreten. z.B. Éleanore und Eleanore könnten in einigen Kollatierungen 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 in UTF8 konvertieren.

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

4
Frank Forte
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
3
Soumik Guha
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();
3
剑二十三

Am sichersten ist es, die Spalten zuerst in einen binären Typ zu ändern und ihn dann mit dem gewünschten Zeichensatz wieder in den Typ zurück 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 lateinischen Tischen versucht und es hat alle diakritischen Punkte bewahrt.

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 es 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 Ihre gesamte Tabelle 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, tun Sie dasselbe in der Datenbank:

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

Wenn Sie Ihre Tabellen nicht konvertieren können oder Ihre Tabelle immer auf einen anderen Zeichensatz als utf8 eingestellt ist, Sie jedoch utf8 möchten, sollten Sie ihn am besten auslöschen und erneut beginnen und Folgendes explizit angeben:

create database database_name character set utf8;
1
user3013048

Die einzige Lösung, die für mich funktioniert hat: http://docs.moodle.org/23/en/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
0
utapyngo

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

  • Siva.

Klicken Sie mit der rechten Maustaste auf Ihre Datenbank, und wählen Sie in der Dropdown-Liste die gewünschten DB-Eigenschaften und -Änderungen aus

enter image description here

0
rvsiva17

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.

0
Aditya Seth

Geben Sie den folgenden Befehl an der Eingabeaufforderung mysql> ein, um die Zeichensatzkodierung 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;
0
Nyein Aung