明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

淺談MySQL備份字符集的問(wèn)題

[摘要][導(dǎo)讀] 1 引子MySQL備份時(shí)選擇字符集是一個(gè)難題,特別是字符集不定的業(yè)務(wù)。mysqldump默認(rèn)使用utf8,而官方也推薦使用utf8。但實(shí)際上,對(duì)于中文,部分相當(dāng)一部分gbk編碼字符沒(méi)有對(duì)應(yīng)的unicode編碼,也就是說(shuō)這部分字符集1 引子MySQL備份時(shí)選擇字符集是一個(gè)難題,特別是字符集...
[導(dǎo)讀] 1 引子MySQL備份時(shí)選擇字符集是一個(gè)難題,特別是字符集不定的業(yè)務(wù)。mysqldump默認(rèn)使用utf8,而官方也推薦使用utf8。但實(shí)際上,對(duì)于中文,部分相當(dāng)一部分gbk編碼字符沒(méi)有對(duì)應(yīng)的unicode編碼,也就是說(shuō)這部分字符集

1 引子

MySQL備份時(shí)選擇字符集是一個(gè)難題,特別是字符集不定的業(yè)務(wù)。mysqldump默認(rèn)使用utf8,而官方也推薦使用utf8。但實(shí)際上,對(duì)于中文,部分相當(dāng)一部分gbk編碼字符沒(méi)有對(duì)應(yīng)的unicode編碼,也就是說(shuō)這部分字符集使用utf8備份會(huì)導(dǎo)致數(shù)據(jù)丟失。那么有沒(méi)有解決方法呢?

當(dāng)然,最直接的方法是將這部分編碼的映射加上。但是,這部分的字符集數(shù)量并不是少數(shù),而且,更蛋疼的是,似乎找不到這部分字符集權(quán)威的映射標(biāo)準(zhǔn)。那么,還有其它方法嗎?

實(shí)際上,如果使用binary進(jìn)行備份,就不會(huì)存在字符集的轉(zhuǎn)換過(guò)程,也就不會(huì)存在上述問(wèn)題。那么,使用binary是否就解決了gbk所有的問(wèn)題呢?答案是NO。

2 binary的問(wèn)題

在講binary的問(wèn)題之前。需要弄清2個(gè)問(wèn)題。對(duì)于MySQL備份,分兩部分:schema信息和實(shí)際數(shù)據(jù)。而Schema信息一律使用utf8編碼,但是,default value除外。這正是問(wèn)題的來(lái)源。

2.1 utf8備份

(1)文件.frm會(huì)存儲(chǔ)table的schema信息,并通過(guò)一個(gè)實(shí)際的記錄來(lái)存儲(chǔ)各個(gè)field的默認(rèn)值。Schema對(duì)應(yīng)的信息(包括comment)使用utf8存儲(chǔ),但是default value使用table指定的字符集進(jìn)行存儲(chǔ)。

(2)當(dāng)執(zhí)行show create table語(yǔ)句時(shí),mysqld會(huì)將frm中的默認(rèn)值從table指定的編碼轉(zhuǎn)成utf8編碼。

(3)當(dāng)mysqld執(zhí)行create table語(yǔ)句,會(huì)將default value從utf8轉(zhuǎn)成table指定的字符集。

2.2 binary備份

如果指定binary進(jìn)行備份。在導(dǎo)入時(shí),在創(chuàng)建table之前,雖然將character_set_client指定為utf8,但collation_connection還是binary。所以,存儲(chǔ)默認(rèn)值時(shí)不會(huì)進(jìn)行utf8到table指定的字符集的轉(zhuǎn)換。如果table指定為gbk編碼,導(dǎo)入必然失敗。

示例:

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

clip_image002

可以看到,正常導(dǎo)出的表,導(dǎo)入?yún)s出現(xiàn)1067 Invalid default value的錯(cuò)誤。

3 解決方法

mysqldump時(shí),在執(zhí)行create table語(yǔ)句之前,增加對(duì)character_set_connection 的設(shè)置。

/*!40101 SET character_set_connection = utf8 */

clip_image004

clip_image006

這也算是MySQL一個(gè)bug,既然schema信息從頭到尾都使用utf8,在執(zhí)行create table之前,就應(yīng)該將連接的字符集變量設(shè)置成utf8,而不是只設(shè)置client的字符集變量。

以上就是 淺談MySQL備份字符集的問(wèn)題的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!


學(xué)習(xí)教程快速掌握從入門(mén)到精通的SQL知識(shí)。