讨论有关MySQL备份字符集
技术百科
巴扎黑
发布时间:2017-08-10
浏览: 次 [导读] 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存储,但是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的字符集变量。
# 的是
# 是一个
# 这部
# 解决方法
# 推荐使用
# 会将
# 也就是说
# 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; ?>
】
相关推荐
- 如何在 ACF 中正确更新嵌套多层 Group 字
- Win11怎么设置开机自动连接宽带_Windows
- Win11资源管理器卡顿怎么办 Win11文件资源
- 如何在 Windows 11 中使用 AlomWa
- Go语言中正确反序列化多个同级XML元素为结构体切
- php增删改查在php8里有什么变化_新特性对cu
- Win11摄像头无法使用怎么办_Win11相机隐私
- c++23 std::expected怎么用 c+
- Go 中实现 Python urllib.quot
- Win11怎么关闭自动修复_跳过Win11开机自动
- Win11怎么看电池循环次数_Win11笔记本电池
- C++如何使用std::async进行异步编程?(
- php增删改查报错1054怎么办_字段名错误排查修
- Python装饰器设计思路_功能增强机制说明【指导
- Python高性能计算项目教程_NumPyCyth
- Windows10电脑怎么设置自动连接WiFi_W
- Win11怎么设置虚拟内存最佳大小_Windows
- php串口通信波特率怎么选_根据硬件手册设置正确波
- 当网站SEO排名下降时,如何应对?
- 如何解决Windows字体显示模糊的问题?(Cle
- 如何在 ACF 中正确更新嵌套多层的 Group
- 如何在Golang中写入JSON文件_保存结构体数
- Linux如何挂载新硬盘_Linux磁盘分区格式化
- 如何使用Golang配置安全开发环境_防止敏感信息
- Windows 11登录时提示“用户配置文件服务登
- Win10如何卸载微软拼音输入法 Win10只保留
- MAC怎么在照片中添加水印_MAC自带编辑工具文字
- 如何使用Golang处理网络超时错误_Golang
- php修改数据怎么批量改状态_批量更新status
- Windows蓝屏BAD_POOL_HEADER故
- Python集合操作技巧_高效去重解析【教程】
- php删除数据怎么加限制_带where条件删除避免
- 如何在Golang中捕获JSON序列化错误_Gol
- 如何使用Golang table-driven基准
- Win11怎么更改任务栏颜色_Windows11个
- Golang如何实现基本的用户注册_Golang用
- Win11怎么设置ip地址_Windows 11手
- Python函数参数高级用法_默认值与可变参数解析
- Windows10系统服务优化指南_Win10禁用
- php8.4匿名类怎么用_php8.4匿名类创建与
- Mac如何调整Dock栏大小和位置_Mac程序坞个
- c# Task.Yield 的作用是什么 它和Ta
- MAC如何快速搜索大文件_MAC磁盘空间分析与冗余
- Windows怎样拦截WPS弹窗广告_Window
- Win11怎么开启上帝模式_创建Windows 1
- 如何使用Golang实现多重错误处理_Golang
- Win11快速助手怎么用_Win11远程协助连接教
- php中$this和::能混用吗_对象与静态作用域
- Windows10如何更改盘符名称_Win10重命
- 如何在 Go 结构体中正确初始化 map 字段

',
QQ客服