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?
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;
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
Zrób kopię zapasową!
-
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;
-
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;
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"
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.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;
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...
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
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';
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>";
}
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
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;
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
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.
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;
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();
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:
- CHAR = > BINARY
- TEXT = > BLOB
- TINYTEXT = > TINYBLOB
- MEDIUMTEXT = > MEDIUMBLOB
- LONGTEXT = > LONGBLOB
- 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;
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
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