一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數(shù)據(jù)庫技術(shù)|

服務(wù)器之家 - 數(shù)據(jù)庫 - Mysql - mysql數(shù)據(jù)校驗過程中的字符集問題處理

mysql數(shù)據(jù)校驗過程中的字符集問題處理

2020-03-28 13:24MYSQL教程網(wǎng) Mysql

在日常應(yīng)用中,我們經(jīng)常會遇到在不同的字符集的數(shù)據(jù)庫直接進(jìn)行數(shù)據(jù)的導(dǎo)入導(dǎo)出操作,針對這個問題,我們來進(jìn)行討論下

場景:
主庫DB:utf8字符集
備庫DB:gbk字符集

需求:
校驗主備數(shù)據(jù)是否一致,并且修復(fù)

校驗過程:
設(shè)置主庫連接為utf8,設(shè)置備庫連接為gbk,分別進(jìn)行查詢,將返回的的結(jié)果集按記錄逐字段比較。

顯示結(jié)果:
原本相同的漢字字符,數(shù)據(jù)校驗認(rèn)為不一致。

原因分析:
對于主庫而已,由于建立連接的字符集為UTF8,則返回的漢字字符編碼為UTF8格式;對于備庫而言則是GBK格式,而程序中通過字符串比較函數(shù)strcasecmp進(jìn)行比較,顯然不同的字符集編碼,相同的字符有不同的二進(jìn)制,因此結(jié)果肯定不會相等。

進(jìn)一步分析:
那么對于這種情況,建立連接應(yīng)該采用哪種字符集呢?GBK or UTF8。其實(shí)選擇任何一種字符集都是OK的,只要是訪問主庫和備庫的字符集保持一致即可,唯一的區(qū)別在于,若選擇的字符集與客戶端的字符集不一致,可能導(dǎo)致無法正常顯示字符,即字符顯示為亂碼。

我們以客戶端的字符集為例,詳細(xì)說說三種情況:【這里的客戶端可以認(rèn)為是SecureCRT】
備注:綠色框代表DB字符集,黃色框代表連接字符集,橙色框代表客戶端
第一種情況:

mysql數(shù)據(jù)校驗過程中的字符集問題處理

就是上述的情況,主庫返回字符的GBK編碼,備庫返回字符的UTF8編碼,因此進(jìn)行字段比對,則會出現(xiàn)誤差。

第二種情況:

mysql數(shù)據(jù)校驗過程中的字符集問題處理

訪問主庫的連接不變,備庫連接由UTF8變?yōu)镚BK,因此進(jìn)行返回時,數(shù)據(jù)庫會將DB的字符集轉(zhuǎn)為GBK返回給客戶端,那么對于客戶端而已,相同字符都是通過GBK編碼表示,因此二進(jìn)制相等,校驗結(jié)果正確。

第三種情況:

mysql數(shù)據(jù)校驗過程中的字符集問題處理

   訪問主庫和備庫的連接都是UTF8,因此對于主庫而已,返回給客戶端的字符編碼由GBK轉(zhuǎn)為UTF8,此時主庫和備庫都是UTF8編碼,校驗結(jié)果正確。但由于客戶端實(shí)質(zhì)是GBK編碼方式顯示,因此返回的漢字字符都是亂碼,但不影響校驗結(jié)果的正確性。

修復(fù):

      既然選擇與主備庫任一一個相同的字符集去訪問,都不會影響校驗結(jié)果的正確性,那么影響修復(fù)呢?由于UTF8的編碼范圍比GBK編碼范圍要大,因此若采用GBK連接訪問UTF8編碼DB,有可能出現(xiàn)部分字符GBK不能表示的情況。

我們拿第二種情況說明,此時主庫為GBK,備庫為UTF8,使用GBK訪問UTF8。假設(shè)存在UTF8轉(zhuǎn)為GBK過程中部分字符丟失,這時候主備庫肯定是不一致的,因為存在部分字符GBK無法表示。 假設(shè)修復(fù)語句如下:

Update  t set c1=master_value  where  c1=slave_value  and id=?

其中t表示表名,id是主鍵表示某一行,master_value為主庫c1列的值,slave_value為備庫c1列的值。此時,slave_value由于UTF8轉(zhuǎn)為GBK已經(jīng)丟失,因此語句執(zhí)行最終影響0行記錄,無法修復(fù)。

 

結(jié)論:

客戶端訪問兩個不同字符集庫進(jìn)行數(shù)據(jù)校驗時,連接采用表示范圍更大的字符集。比如我們常用的字符集表示范圍如下:

Latin<gb2312<gbk<utf8

 

附:mysql客戶端與服務(wù)器通信時字符集編碼轉(zhuǎn)換流程

相關(guān)參數(shù):

– character_set_client:客戶端來源數(shù)據(jù)使用的字符集

– character_set_connection:連接層字符集

– character_set_results:查詢結(jié)果字符集

– character_set_database:當(dāng)前選中數(shù)據(jù)庫的默認(rèn)字符集

– character_set_system:系統(tǒng)元數(shù)據(jù)(字段名等)字符集

 1.客戶端請求服務(wù)器

1)將client的字符集轉(zhuǎn)為connection字符集

2)將connection字符集轉(zhuǎn)為DB內(nèi)部的字符集

 

 2.服務(wù)器返回結(jié)果給客戶端

1)將DB內(nèi)部字符集轉(zhuǎn)為connection字符集

2)將connection字符集轉(zhuǎn)為character_set_results字符集

 

3.設(shè)置字符集命令:set names 字符編碼

指定客戶端與服務(wù)器通信的字符集,包括請求與返回。

SET NAMES 'x'  等價于:

SET character_set_client = x;

SET character_set_results = x;

SET character_set_connection = x;

附圖:

mysql數(shù)據(jù)校驗過程中的字符集問題處理

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 极品丝袜乱系列在线阅读 | 欧美亚洲欧美 | 欧美在线国产 | 国产日韩精品一区二区在线观看 | 欧美日韩一区二区三区免费不卡 | 亚洲精品丝袜在线一区波多野结衣 | 午夜深情在线观看免费 | 亚洲精品中文字幕在线 | 青青久久精品国产 | 图片亚洲va欧美va国产综合 | 1769亚洲资源站365在线 | 欧美日韩在线一区二区三区 | 青青草视频破解版 | 国产午夜亚洲精品不卡 | 极品美女写真菠萝蜜视频 | 97视频久久久 | 花蝴蝶www| 欧洲第一区第二区第三区 | 小辣椒精品福利视频导航 | 亚洲 欧美 国产 在线 日韩 | 亚洲精品乱码久久久久久蜜桃图片 | 亚洲视频在线免费看 | 3d动漫美女被吸乳羞羞视频 | 成人免费一区二区三区在线观看 | 国产免费一区不卡在线 | 草草影院国产 | 爱福利一区二区 | 大胆人gogo888体艺术在线 | 动态图啪啪120秒免费看 | 91九色视频无限观看免费 | 香蕉eeww99国产精品 | 91国内精品久久久久怡红院 | 国内精品九一在线播放 | 春意影院午夜爽爽爽免费 | 999久久免费高清热精品 | 日本精品一区二区三区 | 亚洲AV蜜桃永久无码精品无码网 | 国产亚洲欧美日韩俺去了 | 2021国产精品露脸在线 | 国产一级特黄aa大片在线 | 美女扒开屁股让男人进去 |