浅谈MySQL备份字符集的问题
技术百科
巴扎黑
发布时间:2017-04-17
浏览: 次 [导读] 1 引子mysql备份时选择字符集是一个难题,特别是字符集不定的业务。mysqldump默认使用utf8,而官方也推荐使用utf8。但实际上,对于中文,部分相当一部分gbk编码字符没有对应的unicode编码,也就是说这部分字符集
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存储,但是de
fault 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的字符集变量。
# 的是
# 是一个
# 这部
# 解决方法
# 推荐使用
# 会将
# 也就是说
# mysql
# 默认值
# 转成
# 进行备份
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win11相机打不开提示错误怎么修_相机权限开启与
- 如何使用Golang reflect检查方法数量_
- Windows10如何删除Windows.old_
- Win11怎么更改系统语言为中文_Windows1
- 如何在Golang中实现微服务负载均衡_Golan
- C++如何将C风格字符串(char*)转换为std
- 如何使用正则表达式精确匹配最多含一个换行符的 st
- Go 中 := 短变量声明的类型推导机制详解
- php打包exe后无法读取环境变量_变量配置方法【
- php命令行怎么运行_通过CLI模式执行PHP脚本
- 为什么Go需要go mod文件_Go go mod
- Python实现图数据库操作_Neo4j核心CRU
- windows 10应用商店区域怎么改_windo
- php订单日志怎么按金额排序_php按订单金额排序
- PHP 中如何在函数内持久修改引用变量所指向的目标
- C#如何序列化对象为XML XmlSerializ
- Win11如何设置自动关机 Win11定时关机命令
- Win11怎么设置默认邮件客户端 Win11修改M
- 如何使用Golang table-driven f
- 如何使用Golang开发基础文件下载功能_Gola
- Mac如何解压zip和rar文件?(推荐免费工具)
- php订单日志怎么记录发货_php记录订单发货操作
- Win11怎么查看激活状态_查询Windows 1
- 短链接怎么自定义还原php_修改解码规则适配需求【
- Win11文件夹预览图不显示怎么办_Win11缩略
- Win11怎么开启上帝模式_创建Windows 1
- 如何在JavaScript中动态拼接PHP的bas
- C++如何使用Qt创建第一个GUI窗口?(入门教程
- Win11怎么更改鼠标指针_Windows 11自
- Python函数参数高级用法_默认值与可变参数解析
- 如何使用Golang encoding/json解
- windows如何禁用驱动程序强制签名_windo
- Win10怎样清理C盘浏览器缓存_Win10清理浏
- 如何在Golang中实现自定义Benchmark_
- Win11怎么更改管理员名字 Win11修改账户名
- 如何使用Golang安装API文档生成工具_快速生
- Win11鼠标灵敏度怎么调 Win11鼠标指针移动
- 如何有效拦截拼接式恶意域名的垃圾信息
- XSLT怎么生成动态的HTML属性名和标签名
- Win11怎么关闭应用权限_Windows11相机
- Win10如何设置双wan路由器 Win10双wa
- Win11如何设置省电模式 Win11开启电池节电
- Mac如何查看电池健康百分比_Mac系统信息电源检
- mac怎么分屏_MAC双屏显示与分屏操作技巧【指南
- Win11讲述人怎么关闭_Win11误触开启语音朗
- Windows10系统怎么查看防火墙状态_Win1
- Mac如何调整Dock栏大小和位置_Mac程序坞个
- PowerShell怎么创建复杂的XML结构
- Win11怎么设置开机自动连接宽带_Windows
- Python性能剖析高级教程_cProfileLi

QQ客服