mysql concat 不同字符集_字符编码 - 如何将整个MySQL数据库字符集和排序规则转换为UTF-8?...
字符编码 - 如何将整个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?...相关推荐
- 字符集_第07期:有关 MySQL 字符集的 SQL 语句
本篇为理清字符集的续篇(上一篇:第06期:梳理 MySQL 字符集的相关概念),重点讲述字符集涉及到的 sql 语句用法. 一.character introducer 翻译过来就是字符引导.也就是针 ...
- mysql选择排序规则_关于mysql创建数据库中字符集和排序规则的选择
1:字符集: 一般 主要选择两种: 1:utf8 (看unicode编码区从1 - 126就属于传统utf8区,),一般都够用,除非需要存储特殊字符 2:utf8mb4(utf8mb4兼容utf8 ...
- mysql 中文字符排序规则_mysql中字符集和排序规则说明
数据库需要适应各种语言和字符就需要支持不同的字符集(Character Set),每种字符集也有各自的排序规则(Collation). 一.字符集 字符集,即用于定义字符在数据库中的编码的集合. 常见 ...
- mysql默认字符集和排序_MySQL字符集和排序规则
MySQL在创建数据库是,需要设置数据库的字符集和排序规则,如图所示: 我觉得这里有必要解释下字符集和排序规则这两个概念. 字符集 说到字符集,需要先提下字符.字符集和字符编码这几个词的含义. 字符( ...
- mysql中一次字符集和排序规则引起的sql查询报错
先看sql o.city_name AS '城市',o.city_code AS '城市编码',o.comp_name AS '公司',o.comp_code AS '分公司编码',b.brand_n ...
- MySQL字符集和排序规则详解
本篇博客主要记录mysql当中关于创建数据库时候选择:字符集.排序规则等相关知识.通过示例直观的看出其真正作用. 目录 1.前言 2.mysql字符集 2.排序规则 2.1.排序规则作用 2.2.排序 ...
- mysql的四个默认数据库是什么版本,MySQL5.7数据库字符集和排序规则有四个级别的默认设置:服务器,数据库,表和列。...
MySQL5.7数据库字符集和排序规则有四个级别的默认设置:服务器,数据库,表和列. 最初,服务器字符集和排序规则取决于启动mysqld时使用的选项.可以使用 --character-set-serv ...
- mysql 修改数据库排序规则_如何修改数据库的服务器排序规则
展开全部 您好,很高32313133353236313431303231363533e59b9ee7ad9431333337376263兴为您解答.1.sp_helpsort SELECT SERVE ...
- sql server中字符集和排序规则到底什么关系
--SQLSERVER 中的排序规则 服务器>数据库>表列 --------------------------------- 排序规则简介 ----------------------- ...
最新文章
- linux恢复设置文件夹,将.bashrc文件恢复到Ubuntu中的默认设置
- 数据库常用sql语句
- CAN总线简明易懂教程(三)
- 同时存多个变量缓存 微信小程序_微信小程序 缓存(本地缓存、异步缓存、同步缓存)详解...
- eclipse maven jetty启动修改默认端口
- 面试算法工程师时,我居然被化学专业转行的老哥血虐了
- python每行输出14个数_python – 计算pandas中每行的一些值的列数
- 文件服务器有病毒,服务器共享文件会被病毒加密吗
- JavaScript创建cookie
- UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position...的解决办法
- linux 下的绘图软件Visio
- java共享汽车租赁系统
- 黑马程序员——多态和抽象类的相关知识
- 无法加载DLL:找不到指定模块 问题解决办法
- java怎么连发子弹_HTML-坦克大战-完成子弹连发功能(三)
- “菁英汇项目”(angular)个人总结,以及经验总结
- S7-1500项目案例程序,带5个S7-1200轮询,5个ET200SP
- 美云智数另辟蹊径,SaaS企业和大数据应用发展新趋势
- db2 replace函数的用法_5 分钟快速掌握 MySQL 函数
- 快速清理正在运行的软件