Jak przekonwertować cały zestaw znaków i kolacje bazy danych MySQL do UTF-8?

Jak skonwertować całą bazę danych MySQL na UTF-8 i zestawić na UTF-8?

Author: Nanne, 2011-05-24

17 answers

Użyj ALTER DATABASE oraz ALTER TABLE polecenia.

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

Lub jeśli nadal korzystasz z MySQL w wersji 5.5.2 lub starszej, która nie obsługuje 4-bajtowego UTF-8, Użyj utf8 zamiast utf8mb4:

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
 585
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-06 17:30:32
  1. Zrób kopię zapasową!

  2. Następnie musisz ustawić domyślne zestawy znaków w bazie danych. To nie konwertuje istniejących tabel, tylko ustawia domyślne wartości dla nowo utworzonych tabel.

    ALTER DATABASE dbname CHARACTER SET utf8 COLLATE utf8_general_ci;
    
  3. Następnie będziesz musiał przekonwertować znak ustawiony na wszystkich istniejących tabelach i ich kolumnach. Zakłada to, że bieżące dane są rzeczywiście w bieżącym zestawie znaków. Jeśli kolumny są ustawione na jeden zestaw znaków, ale dane są naprawdę przechowywane w innym, to Ty będzie musiał sprawdzić Instrukcja MySQL Jak sobie z tym poradzić.

    ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
    
 116
Author: newspire,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-19 10:36:38

W powłoce wiersza poleceń

Jeśli jesteś jedną z powłok linii poleceń, możesz to zrobić bardzo szybko. Wystarczy wpisać "dbname": 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"

Jednowarstwowa do prostego kopiowania / wklejania

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"
 70
Author: Jasny - Arnold Daniels,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-05 12:04:30

Możesz utworzyć sql, aby zaktualizować wszystkie tabele za pomocą:

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;

Przechwyć wyjście i uruchom je.

Odpowiedź Arnolda Danielsa powyżej jest bardziej elegancka.
 63
Author: sdfor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-10 17:02:35

Przed kontynuowaniem upewnij się, że: wykonałeś pełną kopię zapasową bazy danych!

Krok 1: Zmiany Poziomu Bazy Danych

  • Identyfikacja zbioru i zestawu znaków w bazie danych

    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%');
    
  • Ustalanie zestawienia dla bazy danych

    ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
    

Krok 2: Zmiany Poziomu Tabeli

  • Identyfikowanie tabel bazy danych za pomocą nieprawidłowego zestawu znaków lub zestawienia

    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%')
    
  • Dostosowywanie zestawiania kolumn tabeli oraz zestaw znaków

Przechwyć górne wyjście sql i uruchom je. (jak po)

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; 

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

 14
Author: John Yin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-08 07:08:29

Użyj HeidiSQL . To bezpłatne i bardzo dobre narzędzie db.

Z menu Narzędzia wprowadź edytor tabeli zbiorczej

Wybierz pełną bazę danych lub wybierz tabele do konwersji,

  • zaznacz Zmień domyślne zestawienie: utf8mb4_general_ci
  • Tick Convert to charset: utf8

Execute

To konwertuje kompletną bazę danych z latin do utf8 w zaledwie kilka sekund.

Działa jak czar:)

HeidiSQL łączy się domyślnie jako utf8 więc każdy znaki specjalne powinny być teraz postrzegane jako znak (æ ø å), a nie jako zakodowane podczas sprawdzania danych tabeli.

Prawdziwą pułapką podczas przechodzenia z latin do utf8 jest upewnienie się, że pdo łączy się z kodowaniem utf8. Jeśli nie, otrzymasz śmieciowe dane włożone do tabeli utf8 i znaki zapytania w całym miejscu na swojej stronie internetowej, co sprawi, że pomyślisz, że dane tabeli nie są utf8...

 7
Author: Tom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-30 14:04:08

Zainspirowany komentarzem @ sdfor, oto skrypt bash, który wykonuje zadanie

#!/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
 5
Author: Camoflame,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-20 07:20:39

Jeśli dane nie są w tym samym zestawie znaków, możesz rozważyć ten fragment z http://dev.mysql.com/doc/refman/5.0/en/charset-conversion.html

Jeśli kolumna ma nonbinary typ danych (CHAR, varchar, TEXT), jej zawartość powinna być zakodowana w zestawie znaków kolumn, a nie w innych zestaw znaków. Jeśli zawartość jest zakodowana w innym znaku ustawić, można przekonwertować kolumnę na binarny typ danych, a następnie do kolumny niebinarnej z żądanym zestawem znaków.

Oto przykład:

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

Upewnij się, że wybrałeś odpowiednie zestawienie, w przeciwnym razie możesz uzyskać unikalne konflikty kluczy. np. Éleanore i Eleanore można uznać za takie same w niektórych zestawieniach.

Na bok:

Miałem sytuację, w której niektóre znaki "pękały" w emailach, mimo że były przechowywane jako UTF-8 w bazie danych. Jeśli wysyłasz wiadomości e-mail za pomocą danych utf8, możesz również przekonwertować wiadomości e-mail do wysłania UTF8.

W Phpmailerze wystarczy zaktualizować ten wiersz: public $CharSet = 'utf-8';

 4
Author: Frank Forte,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-04 16:34:44

W przypadku baz danych, które mają dużą liczbę tabel, można użyć prostego skryptu php, aby zaktualizować zestaw znaków bazy danych i wszystkich tabel, używając następującego kodu:

$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
Author: Dan Lucas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-30 19:26:42
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
Author: Soumik Guha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-10 19:06:04

Jeśli nie możesz przekonwertować tabel lub Twoja tabela jest zawsze ustawiona na zestaw znaków innych niż utf8, ale chcesz utf8, najlepiej będzie wymazać ją i zacząć od nowa i wyraźnie określić:

create database database_name character set utf8;
 1
Author: user3013048,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-20 12:54:29

Jedyne rozwiązanie, które mi się udało: http://docs.moodle.org/23/en/Converting_your_MySQL_database_to_UTF8

Konwersja bazy danych zawierającej tabele

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
Author: utapyngo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-09 08:52:04

Alter table table_name charset = 'utf8';

Jest to proste zapytanie, którego mogłem użyć w moim przypadku, możesz zmienić nazwę tabeli zgodnie z wymaganiami.

 0
Author: Aditya Seth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-23 12:17:12

Aby zmienić kodowanie zestawu znaków na UTF-8 dla samej bazy danych, wpisz następujące polecenie w wierszu mysql>. Zamień DBNAME na nazwę bazy danych:

ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;
 0
Author: Nyein Aung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-25 07:09:50
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();
 0
Author: 剑二十三,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-21 04:47:12

Najbezpieczniejszym sposobem jest najpierw zmodyfikowanie kolumn do typu binarnego, a następnie zmodyfikowanie ich z powrotem do typu it przy użyciu żądanego zestawu znaków.

Każdy typ kolumny ma swój odpowiedni typ binarny, w następujący sposób:

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

Np.:

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

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

Próbowałem w kilku tabelach latin1 i to trzymało wszystkie znaki diakrytyczne.

Możesz wyodrębnić to zapytanie dla wszystkich kolumn robiących to:

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%');

Po zrobieniu tego na wszystkich kolumnach, to zrobisz to na wszystkich tabelach:

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

Aby wygenerować to zapytanie dla całej tabeli, użyj następującego zapytania:

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]');

A teraz, gdy zmodyfikowałeś wszystkie kolumny i tabele, zrób to samo w bazie danych:

ALTER DATABASE [DATA_BASE_NAME] CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci;
 0
Author: MalachiteBR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-21 05:07:59

Można również DB Tool Navicat, który robi to łatwiejsze.

    Siva.

Kliknij prawym przyciskiem myszy bazę danych i wybierz Właściwości DB i zmień zgodnie z potrzebami z listy rozwijanej

Tutaj wpisz opis obrazka

 -1
Author: rvsiva17,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-28 11:19:20