如何将整个MySQL数据库字符集和归类转换为UTF-8?
我怎样才能将整个MySQL数据库字符集转换为UTF-8和整理到UTF-8?
使用ALTER DATABASE
和ALTER TABLE
命令。
ALTER DATABASE databasename CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
或者,如果您仍然使用不支持4字节UTF-8的MySQL 5.5.2或更早版本,请使用utf8
而不是utf8mb4
:
ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci; ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
-
做一个备份!
-
然后你需要在数据库上设置默认的字符集。 这不会转换现有的表,它只设置新创build的表的默认值。
ALTER DATABASE dbname CHARACTER SET utf8 COLLATE utf8_general_ci;
-
然后,您将需要转换所有现有表格及其列上的字符集。 这假定你当前的数据实际上是在当前字符集中。 如果你的列被设置为一个字符集,但是你的数据真的被存储在另一个字符集中,那么你将需要检查MySQL手册的如何处理。
ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
在命令行shell
如果你是一个命令行shell,你可以很快做到这一点。 只需填写“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"
单行简单的复制/粘贴
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"
你可以创buildsql来更新所有的表格:
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;
捕获输出并运行它。
上面的阿诺德·丹尼尔斯的答案更优雅。
在继续之前,请确保您:已完成完整的数据库备份!
第1步:数据库级别更改
-
确定数据库的sorting规则和字符集
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%');
-
修复数据库的sorting规则
ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
第2步:表级别更改
-
用错误的字符集或sorting规则识别数据库表
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%')
-
调整表格列的整理和字符集
捕获上面的sql输出并运行它。 (如下)
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;
请参阅: https : //confluence.atlassian.com/display/CONFKB/How+to+Fix+the+Collation+and+Character+Set+of+a+MySQL+Database
使用HeidiSQL 。 它的免费和一个很好的数据库工具。
从工具菜单中,input批量表编辑器
select完整的数据库或select转换表,
- 勾选更改默认sorting规则:utf8mb4_general_ci
- 勾号转换为字符集:utf8
执行
这将在几秒钟内将完整的数据库从拉丁转换为utf8。
奇迹般有效 :)
HeidiSQL默认连接为utf8,因此任何特殊字符现在都应该被视为字符(而不是在检查表格数据时被编码)。
从拉丁文到utf8的真正的陷阱是确保pdo连接utf8字符集。 如果没有,你会得到垃圾数据插入到UTF8表和问号遍布在您的网页的地方,使您认为表数据不是utf8 …
对于具有大量表的数据库,您可以使用一个简单的php脚本来更新数据库的字符集和所有表,使用以下内容:
$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>"; }
受@sdfor的启发,这里有一个bash脚本来完成这个工作
#!/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
如果数据不在相同的字符集,你可以考虑这个片段http://dev.mysql.com/doc/refman/5.0/en/charset-conversion.html
如果列具有非二进制数据types(CHAR,VARCHAR,TEXT),则其内容应该在列字符集中编码,而不是其他字符集。 如果内容使用不同的字符集进行编码,则可以先将列转换为使用二进制数据types,然后再转换为具有所需字符集的非二进制列。
这里是一个例子:
ALTER TABLE t1 CHANGE c1 c1 BLOB; ALTER TABLE t1 CHANGE c1 c1 VARCHAR(100) CHARACTER SET utf8;
确保select正确的sorting规则,否则可能会遇到唯一的键冲突。 埃莱诺和埃莱诺在一些sorting中可能被认为是相同的。
在旁边:
我曾经遇到过某些字符在电子邮件中“破碎”的情况,尽pipe它们在数据库中被存储为UTF-8。 如果您使用utf8数据发送电子邮件,则可能还需要将您的电子邮件转换为以UTF8格式发送。
在PHPMailer中,只需更新这一行: public $CharSet = 'utf-8';
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
如果你不能让你的表转换,或者你的表总是设置为非utf8字符集,但是你想要utf8,那么你最好的办法就是把它擦掉并重新开始,并明确指定:
create database database_name character set utf8;
唯一的解决scheme,为我工作: http : //docs.moodle.org/23/en/Converting_your_MySQL_database_to_UTF8
转换包含表的数据库
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
alter table table_name charset ='utf8';
这是一个简单的查询,我可以用于我的情况,您可以根据您的要求更改table_name。
要将数据库本身的字符集编码更改为UTF-8,请在mysql>提示符处键入以下命令。 将DBNAMEreplace为数据库名称:
ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;
你也可以使用DB工具Navicat,这样做更容易。
- 湿婆。
右键单击您的数据库,并根据需要在下拉菜单中select数据库属性和更改