最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2014年05月13日 16:10:15   作者:  
在日常應用中,我們經(jīng)常會遇到在不同的字符集的數(shù)據(jù)庫直接進行數(shù)據(jù)的導入導出操作,針對這個問題,我們來進行討論下

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

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

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

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

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

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

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

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

第二種情況:

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

第三種情況:

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

修復:

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

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

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

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

 

結論:

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

Latin<gb2312<gbk<utf8

 

附:mysql客戶端與服務器通信時字符集編碼轉換流程

相關參數(shù):

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

– character_set_connection:連接層字符集

– character_set_results:查詢結果字符集

– character_set_database:當前選中數(shù)據(jù)庫的默認字符集

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

 1.客戶端請求服務器

1)將client的字符集轉為connection字符集

2)將connection字符集轉為DB內部的字符集

 

 2.服務器返回結果給客戶端

1)將DB內部字符集轉為connection字符集

2)將connection字符集轉為character_set_results字符集

 

3.設置字符集命令:set names 字符編碼

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

SET NAMES 'x'  等價于:

SET character_set_client = x;

SET character_set_results = x;

SET character_set_connection = x;

附圖:

相關文章

  • MySQL四種日志binlog/redolog/relaylog/undolog詳解

    MySQL四種日志binlog/redolog/relaylog/undolog詳解

    undo?log主要存儲的也是邏輯日志,比如我們要insert一條數(shù)據(jù)了,那undo?log會記錄的一條對應的delete日志,我們要update一條記錄時,它會記錄一條對應相反的update記錄,這篇文章主要介紹了MySQL四種日志binlog/redolog/relaylog/undolog,需要的朋友可以參考下
    2024-08-08
  • mysql派生表(Derived Table)簡單用法實例解析

    mysql派生表(Derived Table)簡單用法實例解析

    這篇文章主要介紹了mysql派生表(Derived Table)簡單用法,結合實例形式分析了mysql派生表的原理、簡單使用方法及操作注意事項,需要的朋友可以參考下
    2019-12-12
  • mysqlsla慢查詢分析工具使用筆記

    mysqlsla慢查詢分析工具使用筆記

    mysqlsla是一款幫助語句分析、過濾、和排序的功能,能夠處理MySQL慢查詢日志、二進制日志等。整體來說, 功能非常強大. 能制作SQL查詢數(shù)據(jù)報表,分析包括執(zhí)行頻率, 數(shù)據(jù)量, 查詢消耗等
    2014-05-05
  • MySQL深分頁問題解決思路

    MySQL深分頁問題解決思路

    這篇文章主要介紹了優(yōu)雅地解決mysql深分頁問題,本文將會討論當mysql表大數(shù)據(jù)量的情況,如何優(yōu)化深分頁問題,并附上最近的優(yōu)化慢sql問題的案例偽代碼,需要的朋友可以參考下
    2022-12-12
  • MySQL視圖簡介及基本操作教程

    MySQL視圖簡介及基本操作教程

    這篇文章主要給大家介紹了關于MySQL視圖簡介及基本操作的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用MySQL具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-04-04
  • mysql 啟動1067錯誤及修改字符集重啟之后復原無效問題

    mysql 啟動1067錯誤及修改字符集重啟之后復原無效問題

    這篇文章主要介紹了mysql 啟動1067錯誤及修改字符集重啟之后復原無效問題,需要的朋友可以參考下
    2017-10-10
  • MySQL入門(二) 數(shù)據(jù)庫數(shù)據(jù)類型詳解

    MySQL入門(二) 數(shù)據(jù)庫數(shù)據(jù)類型詳解

    這個數(shù)據(jù)庫所遇到的數(shù)據(jù)類型今天統(tǒng)統(tǒng)在這里講清楚了,以后在看到什么數(shù)據(jù)類型,咱度應該認識,對我來說,最不熟悉的應該就是時間類型這塊了。但是通過今天的學習,已經(jīng)解惑了。下面就跟著我的節(jié)奏去把這個拿下吧
    2018-07-07
  • MySQL使用聚合函數(shù)進行單表查詢

    MySQL使用聚合函數(shù)進行單表查詢

    這篇文章主要介紹了MySQL使用聚合函數(shù)進行單表查詢,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • MySQL8數(shù)據(jù)庫安裝及SQL語句詳解

    MySQL8數(shù)據(jù)庫安裝及SQL語句詳解

    本文詳細講解了MySQL8數(shù)據(jù)庫安裝及SQL語句用法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • Mysql中有關Datetime和Timestamp的使用總結

    Mysql中有關Datetime和Timestamp的使用總結

    mysql數(shù)據(jù)庫常用的時間類型有timestamp和datetime,兩者主要區(qū)別是占用存儲空間長度不一致、可存儲的時間也有限制,本文就來詳細的介紹一下,感興趣的可以了解一下
    2021-12-12

最新評論

开平市| 东安县| 于田县| 乌苏市| 房山区| 海伦市| 威远县| 星座| 安达市| 得荣县| 大理市| 兴化市| 托里县| 长治县| 会昌县| 临清市| 莱西市| 察雅县| 宜良县| 白水县| 永丰县| 昔阳县| 安塞县| 婺源县| 临邑县| 巴彦县| 肃南| 平凉市| 富民县| 慈溪市| 右玉县| 亚东县| 青岛市| 台南市| 金湖县| 济源市| 宜良县| 潞西市| 泊头市| 牡丹江市| 安岳县|