如何将整个MySQL数据库字符集和归类转换为UTF-8?

我怎样才能将整个MySQL数据库字符集转换为UTF-8和整理到UTF-8?

使用ALTER DATABASEALTER 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; 
  1. 做一个备份!

  2. 然后你需要在数据库上设置默认的字符集。 这不会转换现有的表,它只设置新创build的表的默认值。

     ALTER DATABASE dbname CHARACTER SET utf8 COLLATE utf8_general_ci; 
  3. 然后,您将需要转换所有现有表格及其列上的字符集。 这假定你当前的数据实际上是在当前字符集中。 如果你的列被设置为一个字符集,但是你的数据真的被存储在另一个字符集中,那么你将需要检查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+Collat​​ion+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数据库属性和更改

在这里输入图像描述