字符编码 - 如何将整个MySQL数据库字符集和排序规则转换为UTF-8?

如何将整个MySQL数据库字符集转换为UTF-8并将整理转换为UTF-8?

17个解决方案

591 votes

使用utf8和utf8命令。

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;

BalusC answered 2019-01-04T16:25:02Z

116 votes

做个备份!

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

ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

然后,您将需要转换所有现有表及其列的char集。 这假设您当前的数据实际上在当前字符集中。 如果您的列设置为一个字符集但您的数据确实存储在另一个字符集中,则需要检查MySQL手册以了解如何处理此问题。

ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

newspire answered 2019-01-04T16:25:48Z

70 votes

在命令行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"

One-liner用于简单复制/粘贴

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"

Jasny - Arnold Daniels answered 2019-01-04T16:26:26Z

65 votes

您可以使用以下命令创建sql以更新所有表:

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;

捕获输出并运行它。

Arnold Daniels的回答更优雅。

sdfor answered 2019-01-04T16:27:05Z

14 votes

在继续之前,请确保您:已完成完整的数据库备份!

第1步:数据库级别更改

识别数据库的排序规则和字符集

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

修复数据库的排序规则

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

第2步:表级更改

使用不正确的字符集或排序规则识别数据库表

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]

John Yin answered 2019-01-04T16:28:31Z

7 votes

使用HeidiSQL。 它是免费的,非常好的数据库工具。

从工具菜单中,输入批量表编辑器

选择完整的数据库或选择要转换的表格,

tick更改默认排序规则:utf8mb4_general_ci

tick转换为charset:utf8

执行

这可以在几秒钟内将完整的数据库从拉丁语转换为utf8。

奇迹般有效 :)

HeidiSQL默认连接为utf8,因此任何特殊字符现在应该被视为字符(æøå),而不是在检查表数据时编码。

从拉丁语转到utf8时真正的陷阱是确保pdo与utf8 charset连接。 如果没有,你会将垃圾数据插入到utf8表中并在网页上的所有地方出现问号,让你认为表数据不是utf8 ...

Tom answered 2019-01-04T16:29:56Z

5 votes

受@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

Camoflame answered 2019-01-04T16:30:19Z

4 votes

如果数据不在同一个字符集中,您可以考虑[http://dev.mysql.com/doc/refman/5.0/en/charset-conversion.html]中的这个片段。

如果列具有非二进制数据类型(CHAR,VARCHAR,TEXT),则为   内容应该在列字符集中编码,而不是其他一些   字符集。 如果内容以不同的字符编码   设置,您可以将列转换为首先使用二进制数据类型,和   然后到具有所需字符集的非二进制列。

这是一个例子:

ALTER TABLE t1 CHANGE c1 c1 BLOB;

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

确保选择正确的排序规则,否则您可能会遇到唯一的关键冲突。 例如在一些校对中,Éleanore和Eleanore可能被认为是相同的。

在旁边:

我有一种情况,即某些字符在电子邮件中“破坏”,即使它们在数据库中存储为UTF-8。 如果您使用utf8数据发送电子邮件,您可能还希望将电子邮件转换为以UTF8格式发送。

在PHPMailer中,只需更新此行:public $CharSet = 'utf-8';

Frank Forte answered 2019-01-04T16:31:21Z

4 votes

对于具有大量表的数据库,您可以使用简单的PHP脚本使用以下内容更新数据库的charset和所有表:

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

";

var_dump($alter_table_result);

echo "

";

}

Dan Lucas answered 2019-01-04T16:31:43Z

3 votes

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

Soumik Guha answered 2019-01-04T16:31:59Z

1 votes

如果你不能让你的表转换或者你的表总是被设置为某个非utf8字符集,但你想要utf8,你最好的选择可能是把它擦除并重新开始并明确指定:

create database database_name character set utf8;

user3013048 answered 2019-01-04T16:32:22Z

0 votes

唯一对我有用的解决方案:[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

utapyngo answered 2019-01-04T16:32:52Z

0 votes

alter table table_name charset ='utf8';

这是我能够用于我的案例的简单查询,您可以根据您的要求更改table_name。

Aditya Seth answered 2019-01-04T16:33:22Z

0 votes

要将数据库本身的字符集编码更改为UTF-8,请在mysql&gt;处键入以下命令: 提示。 将DBNAME替换为数据库名称:

ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;

Nyein Aung answered 2019-01-04T16:33:44Z

0 votes

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();

剑二十三 answered 2019-01-04T16:34:00Z

0 votes

最安全的方法是首先将列修改为二进制类型,然后使用所需的字符集将其修改回类型。

每个列类型都有各自的二进制类型,如下所示:

CHAR =&gt;BINARY

TEXT =&gt;BLOB

TINYTEXT =&gt;TINYBLOB

MEDIUMTEXT =&gt;MEDIUMBLOB

LONGTEXT =&gt;LONGBLOB

VARCHAR =&gt;VARBINARY

例如。:

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

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

我尝试了几张latin1表,它保留了所有的变音符号。

您可以为执行此操作的所有列提取此查询:

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

在所有列上执行此操作后,您将在所有表上执行此操作:

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

要为所有表生成此查询,请使用以下查询:

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

现在您修改了所有列和表,在数据库上执行相同操作:

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

MalachiteBR answered 2019-01-04T16:35:56Z

-1 votes

您还可以使用数据库工具Navicat,它更容易实现。

湿婆。

右键单击您的数据库&amp; 选择数据库属性&amp; 在“下拉”中根据需要进行更改

rvsiva17 answered 2019-01-04T16:36:32Z

mysql concat 不同字符集_字符编码 - 如何将整个MySQL数据库字符集和排序规则转换为UTF-8?...相关推荐

  1. 字符集_第07期:有关 MySQL 字符集的 SQL 语句

    本篇为理清字符集的续篇(上一篇:第06期:梳理 MySQL 字符集的相关概念),重点讲述字符集涉及到的 sql 语句用法. 一.character introducer 翻译过来就是字符引导.也就是针 ...

  2. mysql选择排序规则_关于mysql创建数据库中字符集和排序规则的选择

    1:字符集: 一般 主要选择两种: 1:utf8   (看unicode编码区从1 - 126就属于传统utf8区,),一般都够用,除非需要存储特殊字符 2:utf8mb4(utf8mb4兼容utf8 ...

  3. mysql 中文字符排序规则_mysql中字符集和排序规则说明

    数据库需要适应各种语言和字符就需要支持不同的字符集(Character Set),每种字符集也有各自的排序规则(Collation). 一.字符集 字符集,即用于定义字符在数据库中的编码的集合. 常见 ...

  4. mysql默认字符集和排序_MySQL字符集和排序规则

    MySQL在创建数据库是,需要设置数据库的字符集和排序规则,如图所示: 我觉得这里有必要解释下字符集和排序规则这两个概念. 字符集 说到字符集,需要先提下字符.字符集和字符编码这几个词的含义. 字符( ...

  5. mysql中一次字符集和排序规则引起的sql查询报错

    先看sql o.city_name AS '城市',o.city_code AS '城市编码',o.comp_name AS '公司',o.comp_code AS '分公司编码',b.brand_n ...

  6. MySQL字符集和排序规则详解

    本篇博客主要记录mysql当中关于创建数据库时候选择:字符集.排序规则等相关知识.通过示例直观的看出其真正作用. 目录 1.前言 2.mysql字符集 2.排序规则 2.1.排序规则作用 2.2.排序 ...

  7. mysql的四个默认数据库是什么版本,MySQL5.7数据库字符集和排序规则有四个级别的默认设置:服务器,数据库,表和列。...

    MySQL5.7数据库字符集和排序规则有四个级别的默认设置:服务器,数据库,表和列. 最初,服务器字符集和排序规则取决于启动mysqld时使用的选项.可以使用 --character-set-serv ...

  8. mysql 修改数据库排序规则_如何修改数据库的服务器排序规则

    展开全部 您好,很高32313133353236313431303231363533e59b9ee7ad9431333337376263兴为您解答.1.sp_helpsort SELECT SERVE ...

  9. sql server中字符集和排序规则到底什么关系

    --SQLSERVER 中的排序规则 服务器>数据库>表列 --------------------------------- 排序规则简介 ----------------------- ...

最新文章

  1. linux恢复设置文件夹,将.bashrc文件恢复到Ubuntu中的默认设置
  2. 数据库常用sql语句
  3. CAN总线简明易懂教程(三)
  4. 同时存多个变量缓存 微信小程序_微信小程序 缓存(本地缓存、异步缓存、同步缓存)详解...
  5. eclipse maven jetty启动修改默认端口
  6. 面试算法工程师时,我居然被化学专业转行的老哥血虐了
  7. python每行输出14个数_python – 计算pandas中每行的一些值的列数
  8. 文件服务器有病毒,服务器共享文件会被病毒加密吗
  9. JavaScript创建cookie
  10. UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position...的解决办法
  11. linux 下的绘图软件Visio
  12. java共享汽车租赁系统
  13. 黑马程序员——多态和抽象类的相关知识
  14. 无法加载DLL:找不到指定模块 问题解决办法
  15. java怎么连发子弹_HTML-坦克大战-完成子弹连发功能(三)
  16. “菁英汇项目”(angular)个人总结,以及经验总结
  17. S7-1500项目案例程序,带5个S7-1200轮询,5个ET200SP
  18. 美云智数另辟蹊径,SaaS企业和大数据应用发展新趋势
  19. db2 replace函数的用法_5 分钟快速掌握 MySQL 函数
  20. 快速清理正在运行的软件

热门文章

  1. 乌镇AI论坛最全盘点:中国互联网半壁江山坐在了一起,他们怎么看AI
  2. JAVA项目实战过程中踩坑总结一
  3. Buu-crypto-write up
  4. Php Adodb 初探
  5. IaC示例:Terraform Ansible自动化创建K3S集群
  6. 中国服装行业柔性供应链
  7. SAT阅读模拟练习题一篇
  8. 用Python求解数学规划问题
  9. 专享策略04 | 商品通用套利模型(二)
  10. 【重磅】全球AI芯片排行榜发布 解读入围的七家中国公司