浅谈MySQL备份字符集的问题
1 引子
MySQL备份时选择字符集是一个难题,特别是字符集不定的业务。mysqldump默认使用utf8,而官方也推荐使用utf8。但实际上,对于中文,部分相当一部分gbk编码字符没有对应的unicode编码,也就是说这部分字符集使用utf8备份会导致数据丢失。那么有没有解决方法呢?
当然,最直接的方法是将这部分编码的映射加上。但是,这部分的字符集数量并不是少数,而且,更蛋疼的是,似乎找不到这部分字符集权威的映射标准。那么,还有其它方法吗?
实际上,如果使用binary进行备份,就不会存在字符集的转换过程,也就不会存在上述问题。那么,使用binary是否就解决了gbk所有的问题呢?答案是NO。
2 binary的问题
在讲binary的问题之前。需要弄清2个问题。对于MySQL备份,分两部分:schema信息和实际数据。而Schema信息一律使用utf8编码,但是,default value除外。这正是问题的来源。
2.1 utf8备份
(1)文件.frm会存储table的schema信息,并通过一个实际的记录来存储各个field的默认值。Schema对应的信息(包括comment)使用utf8存储,但是default value使用table指定的字符集进行存储。
(2)当执行show create table语句时,mysqld会将frm中的默认值从table指定的编码转成utf8编码。
(3)当mysqld执行create table语句,会将default value从utf8转成table指定的字符集。
2.2 binary备份
如果指定binary进行备份。在导入时,在创建table之前,虽然将character_set_client指定为utf8,但collation_connection还是binary。所以,存储默认值时不会进行utf8到table指定的字符集的转换。如果table指定为gbk编码,导入必然失败。
示例:
|
CREATE TABLE `t1`( `iNetbarId` int(11) NOT NULL DEFAULT '0', `iUin` bigint(20) NOT NULL DEFAULT '0', `vNetbarName` varchar(80) NOT NULL DEFAULT '“-”', PRIMARY KEY (`iNetbarId`) ) ENGINE=InnoDB DEFAULT CHARSET=gbk; insert into t1 values(1,1,'xxxx'); |

可以看到,正常导出的表,导入却出现1067 Invalid default value的错误。
3 解决方法
mysqldump时,在执行create table语句之前,增加对character_set_connection 的设置。
/*!40101 SET character_set_connection = utf8 */


这也算是MySQL一个bug,既然schema信息从头到尾都使用utf8,在执行create table之前,就应该将连接的字符集变量设置成utf8,而不是只设置client的字符集变量。
作者:YY哥
出处:http://www.cnblogs.com/hustcat/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
浅谈MySQL备份字符集的问题的更多相关文章
- 浅谈mysql主从复制的高可用解决方案
1.熟悉几个组件(部分摘自网络)1.1.drbd —— DRBD(Distributed Replicated Block Device),DRBD号称是 "网络 RAID" ...
- 浅谈mysql innodb缓存策略
浅谈mysql innodb缓存策略: The InnoDB Buffer Pool Innodb 持有一个存储区域叫做buffer pool是为了在内存中缓存数据和索引,知道innodb buffe ...
- 浅谈mysql配置优化和sql语句优化【转】
做优化,我在这里引用淘宝系统分析师蒋江伟的一句话:只有勇于承担,才能让人有勇气,有承担自己的错误的勇气.有承担错误的勇气,就有去做事得勇气.无论做什么事,只要是对的,就要去做,勇敢去做.出了错误,承担 ...
- 浅谈MySQL中优化sql语句查询常用的30种方法 - 转载
浅谈MySQL中优化sql语句查询常用的30种方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使 ...
- 浅谈Mysql共享锁、排他锁、悲观锁、乐观锁及其使用场景
浅谈Mysql共享锁.排他锁.悲观锁.乐观锁及其使用场景 Mysql共享锁.排他锁.悲观锁.乐观锁及其使用场景 一.相关名词 |--表级锁(锁定整个表) |--页级锁(锁定一页) |--行级锁(锁 ...
- (转)运维角度浅谈MySQL数据库优化
转自:http://lizhenliang.blog.51cto.com/7876557/1657465 一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架 ...
- 运维角度浅谈MySQL数据库优化(转)
一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇博文主要谈MySQL数据库发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致分 ...
- 从运维角度浅谈 MySQL 数据库优化
一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇博文主要谈MySQL数据库发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致分 ...
- 浅谈MySQL存储引擎-InnoDB&MyISAM
存储引擎在MySQL的逻辑架构中位于第三层,负责MySQL中的数据的存储和提取.MySQL存储引擎有很多,不同的存储引擎保存数据和索引的方式是不同的.每一种存储引擎都有它的优势和劣势,本文只讨论最常见 ...
随机推荐
- P1463 [SDOI2005]反素数ant
题意: 题解: 思维难度不高,考虑到n较大,而反质数个数较少 所以只要算出每个反质数即可 考虑如何计算,可以发现,我们只需枚举计算出约数有x个的最小数,再做一下判断即可 另外约数的个数=(a1+1)( ...
- 【转】一张图解析FastAdmin中的表格列表的功能
一张图解析FastAdmin中的表格列表的功能 功能描述请根据图片上的数字索引查看对应功能说明. 1.时间筛选器如果想在搜索栏使用时间区间进行搜索,则可以在JS中修改修改字段属性,如 {field: ...
- 素数筛选-hdu1262
题目描述: 代码实现: #include<stdio.h> using namespace std; ]; void sieve(int n) { ;i<;i++) prime[i] ...
- 解决html5中video标签无法播放mp4问题的办法
这篇文章主要给大家介绍了关于解决html5中video标签无法播放mp4问题的办法,文中介绍的非常详细,相信会对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧. 最近发现了一个 ...
- iOS 技术篇:渐变色的简单实现方式
实现效果 //渐变设置 UIView *view = [[UIView alloc] initWithFrame:CGRectMake(,, [UIScreen mainScreen].bounds. ...
- 磁盘修复工具TestDisk
磁盘修复工具TestDisk TestDisk一款免费的数据的恢复工具,可以用于还原丢失的磁盘分区,恢复磁盘驱动引导功能.它还能检测磁盘损坏的原因,如病毒感染.人为损坏.恶意软件等.该工具采用文本菜单 ...
- OpenStack-Zun 使用
Zun组件简介 Zun是Openstack中提供容器管理服务的组件,于2016年6月建立.Zun的目标是提供统一的Openstack API用于启动和管理容器,支持多种容器技术.Zun原来称为Higg ...
- Prism中命令可用性无法自动刷新
http://stackoverflow.com/questions/2444927/wpf-prism-canexecute-method-not-being-called It is most l ...
- 创建PCB原理图的模板
Q:创建PCB原理图的模板,主要就是设置模板的大小,右下角的信息框, 效果图如下: 创建PCB工程 创建原理图 设置模板,方便以后画原理图 打开模板的方式有:1按DO 2双击边框 标题块是附带有的,取 ...
- bootstarp布局
<!doctype html><html > <head> <meta charset="utf-8"> <link rel= ...