青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

ACG狂人

其實(shí)我更愛姐汁...

封裝MySQL時(shí)解決的兩個字符集問題

在我開始封裝MySQL C API時(shí),真的沒有想過居然會在字符集問題上連續(xù)卡殼,折騰了一下午+一晚上,終于搞定這些問題。下面記錄一下我遇見的問題以及解決辦法,以作備忘。
首先遇見的當(dāng)然是中文亂碼問題。這個問題相對來說資料比較多,文檔寫得應(yīng)該也是很清楚的,但是我沒心思看,靠猜搞定。我首先設(shè)置MySQL服務(wù)器的默認(rèn)字符集為UTF8,并保證我操作的表中的列字符集也是UTF8,然后重啟MySQL服務(wù),并嘗試用mysql_query("INSERT INTO TestTable VALUES('你好')")來寫入,結(jié)果失敗在預(yù)料之中。我猜可能可以使用類似"INSERT INTO TestTable VALUES('\0x2734\0x3432')"這樣的方式寫入中文,但這樣太丑了,也沒有實(shí)用價(jià)值,我堅(jiān)決不會去用。我又嘗試使用MultiByteToWideChar去做,甚至使用了Qt的QTextCodec去轉(zhuǎn)換“你好”這兩個字,結(jié)果依然失敗。這就有些蹊蹺了,我決定調(diào)用mysql_character_set_name()看看到底有沒有正確的設(shè)置成UTF8格式,讓我意料之外的是:結(jié)果是latin1,這難道是拉丁字符集??我查看了一下API函數(shù)的相關(guān)說明,發(fā)現(xiàn)這里獲取到的是客戶端鏈接的字符集,我突然覺得,也許MySQL可以自動的在客戶端與服務(wù)器之間的字符集進(jìn)行轉(zhuǎn)化!說做就做,我查到了可以用mysql_options()或者mysql_set_character_name()函數(shù)來設(shè)置客戶端鏈接字符集,但這兩個函數(shù)用的時(shí)機(jī)分別在調(diào)用mysql_real_connect()之前或之后。我將客戶端鏈接設(shè)置成gb2312字符集,這是VC中支持中文的標(biāo)準(zhǔn)字符集之一(另一個標(biāo)準(zhǔn)是UTF16,需要用wchar_t  wstring和常量字符串前的L),結(jié)果,當(dāng)然是非常正確的插入中文啦,呵呵!
正當(dāng)我覺得下面的封裝肯定會順湯順?biāo)畷r(shí),在封裝基本完成的時(shí)候,我發(fā)現(xiàn)控制臺不能輸出我從MySQL取出的中文了!這太奇怪了,輸出英文就沒有問題,而中文雖然的確被準(zhǔn)確無誤的讀入了std::string中(通過單步調(diào)試和ofstream得到確認(rèn)),然而輸出到cout中卻會出錯。為什么文件流沒問題,控制臺流會出問題呢?我跟蹤了代碼,發(fā)現(xiàn)在fputc()函數(shù)中出現(xiàn)了問題。另一個奇特的地方,就是在mysql_init()函數(shù)被調(diào)用之前,cout可以正確輸出中文,但調(diào)用之后就不能輸出,iostate被賦予4值,即badbit。我求了一下google,發(fā)現(xiàn)sputc()中的一個_nolock_write()函數(shù)是msvcrtd.lib中的函數(shù),暈了,我在單步調(diào)試中也發(fā)現(xiàn)就是這里有問題,確切的說,mysql_init()函數(shù)被調(diào)用后,_nolock_write()函數(shù)就會出錯。哈哈,總結(jié)出了這些特點(diǎn)之后,我已經(jīng)隱約猜到了是哪里的問題了,還記得前幾日才寫的blog里的東西,我由于想要將libmysql.lib換成mysqlclient.lib靜態(tài)庫,所以便禁掉了msvcrtd.lib庫,我肯定這里面有關(guān)聯(lián)。
到底是什么原因呢?我覺得,由于這個MySQL的SDK不是我自己編譯的,mysqlclient.lib里面調(diào)用crt函數(shù)時(shí),對字符集的本地化做了設(shè)置,由于是歐美的字符集設(shè)置,所以一旦我調(diào)用了mysqlclient.lib里的函數(shù),就無法再顯示中文了。
猜出了問題的根源,那么如何解決這個問題呢?我可以肯定的是,使用std::cout.imbue(std::locale())是行不通的,那么下面就是列出的幾個辦法:
1、使用人家編譯好的動態(tài)庫,libmysql.lib,并將libmysql.dll拷貝過來,由于動態(tài)庫和你的程序共享crt dll,因此字符集設(shè)置應(yīng)該會是一致的。
2、如果你還是想用靜態(tài)庫,可以考慮自己下載源碼并編譯一遍,這是根本的解決辦法。
3、如果你可以自己編譯,且想用mysqlclient.lib,那么就重新編譯mysqlclient吧,動態(tài)靜態(tài)都可以。不過官網(wǎng)上下載的編譯好的mysqlclient.lib是靜態(tài)的,不能使用。

我最終的解決辦法是第1種,因?yàn)楸容^懶,不想自己再去編譯了,呵呵。

posted on 2009-10-09 22:29 釀妹汁 閱讀(1994) 評論(3)  編輯 收藏 引用 所屬分類: C++

評論

# re: 封裝MySQL時(shí)解決的兩個字符集問題 2009-10-11 11:33 Jeff Chen

我在之前的項(xiàng)目里遇到過相同的問題。

解決方案是:將數(shù)據(jù)庫的字符集都改為UTC8,并將服務(wù)器端和客戶端的配置文件的字符集設(shè)置都改為UTC8。  回復(fù)  更多評論   

# re: 封裝MySQL時(shí)解決的兩個字符集問題 2010-12-23 10:58 天下

真有那么復(fù)雜嗎?

歡迎去我的博客看看.有關(guān)于C操作Mysql這一塊的.

不過C操作MYSQL沒有mysql++操作方便.
特別是多線程環(huán)境.
  回復(fù)  更多評論   

# re: 封裝MySQL時(shí)解決的兩個字符集問題 2010-12-23 10:58 天下

真有那么復(fù)雜嗎?

歡迎去我的博客看看.有關(guān)于C操作Mysql這一塊的.

不過C操作MYSQL沒有mysql++操作方便.
特別是多線程環(huán)境.  回復(fù)  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久噜噜噜久噜久久| 巨乳诱惑日韩免费av| 亚洲一区中文| 午夜视频一区二区| 米奇777超碰欧美日韩亚洲| 国产精品二区二区三区| 亚洲一区二区三区777| 欧美成人午夜77777| 麻豆九一精品爱看视频在线观看免费| 久久免费少妇高潮久久精品99| 欧美亚洲色图校园春色| 亚洲小说欧美另类婷婷| 国产精品香蕉在线观看| 亚洲激情女人| 含羞草久久爱69一区| 亚洲国产精品成人久久综合一区| 日韩视频亚洲视频| 国产乱码精品一区二区三| 亚洲韩国一区二区三区| 国产精品magnet| 欧美国产视频在线观看| 欧美啪啪一区| 欧美电影资源| 亚洲电影在线看| 午夜精品在线| 亚洲精品视频免费观看| 午夜视频一区二区| 亚洲欧洲精品一区| 亚洲高清视频一区| 欧美一区日本一区韩国一区| 国产午夜亚洲精品理论片色戒| 一区二区三区四区五区精品视频 | 欧美午夜精品久久久久久久| 久久成人18免费网站| 日韩亚洲一区在线播放| 国内自拍亚洲| 亚洲深夜av| 在线综合视频| 久久一区二区三区超碰国产精品| 欧美精品videossex性护士| 欧美一区二视频在线免费观看| 一区二区三区鲁丝不卡| 亚洲成人在线视频播放| 午夜一区不卡| 亚洲欧美日韩综合| 午夜精品久久久久久久久| 在线看国产日韩| 欧美一区三区三区高中清蜜桃| 欧美视频不卡中文| 久久亚洲视频| 免费不卡欧美自拍视频| 欧美成人xxx| 亚洲国产精品t66y| 国产精品成人国产乱一区| 亚洲欧美影音先锋| 免费人成精品欧美精品| 亚洲免费在线观看视频| 一区二区三区你懂的| 国产精品久久久久久五月尺 | 欧美国产日韩a欧美在线观看| 亚洲欧洲一区二区三区在线观看| 校园激情久久| 欧美经典一区二区| 欧美高清免费| 国产精品海角社区在线观看| 性亚洲最疯狂xxxx高清| 国产精品综合视频| 亚洲视频精品| 久久高清国产| 国内外成人在线视频| 久久成人av少妇免费| 久久国产精品网站| 欧美激情1区2区3区| 亚洲私人黄色宅男| 欧美一二三视频| 影音先锋亚洲电影| 欧美成人精品h版在线观看| 在线播放不卡| 久久另类ts人妖一区二区| 欧美国产日韩在线观看| 亚洲国产综合视频在线观看| 亚洲在线成人| 噜噜噜躁狠狠躁狠狠精品视频| 欧美成人午夜| 亚洲激情成人| 亚洲一区二区免费看| 国产日韩专区| 久久阴道视频| 亚洲国产老妈| 精品成人国产| 久久综合九九| 国产在线精品一区二区夜色| 久久精品国产亚洲精品| 久久不射2019中文字幕| 亚洲精品女av网站| 亚洲一区二区三区涩| 欧美va亚洲va日韩∨a综合色| 国产精品xxxxx| 欧美日韩国产一区| 蜜桃精品一区二区三区| 亚洲第一精品影视| 国产欧美高清| 免费在线欧美黄色| 久久av在线看| 亚洲经典三级| 欧美国产欧美亚州国产日韩mv天天看完整 | 亚洲私人影吧| 亚洲午夜精品久久| 亚洲国产99精品国自产| 欧美日韩国产精品专区| 亚洲欧美国产另类| 欧美日韩在线大尺度| 亚洲在线视频免费观看| 免费视频一区| 制服诱惑一区二区| 一区二区在线观看av| 欧美成人自拍| 久久精品视频一| 亚洲乱码国产乱码精品精可以看| 日韩视频免费观看| 国产精品亚洲美女av网站| 久久久综合激的五月天| 一区二区三区 在线观看视| 在线视频精品| 91久久在线播放| av成人免费| 亚洲精品久久| 国产婷婷色一区二区三区四区| 欧美一区影院| 亚洲精品一区二区三区av| 蜜臀av性久久久久蜜臀aⅴ四虎 | 欧美一区二区视频在线观看2020| 国产一区二区三区精品久久久| 欧美精选一区| 一本综合精品| 黄色欧美成人| 最新成人在线| 欧美成人亚洲成人| 亚洲福利视频二区| 国产一区在线看| 国产精品久久久999| 欧美日韩免费看| 日韩亚洲精品在线| 亚洲精品欧洲精品| 亚洲国产欧美一区二区三区同亚洲 | 欧美视频一二三区| 欧美成人蜜桃| 久久中文精品| 久久久999国产| 亚洲一区二区三区777| 亚洲无限av看| 一区二区免费在线视频| 亚洲视频1区2区| 亚洲精品视频在线播放| 午夜精品久久久久久久99水蜜桃| 国产精品久久激情| 欧美三区美女| 先锋影音国产一区| 亚洲永久字幕| 午夜精品久久久| 久久午夜色播影院免费高清| 亚洲高清久久| 亚洲肉体裸体xxxx137| 一本久久知道综合久久| 亚洲人成亚洲人成在线观看| 亚洲级视频在线观看免费1级| 国产精品久久久久久久久久久久| 亚洲午夜精品久久久久久浪潮| 久久国产色av| 久久久久久日产精品| 久久米奇亚洲| 欧美成人午夜剧场免费观看| 999亚洲国产精| 美日韩免费视频| 在线亚洲欧美专区二区| 亚洲国产裸拍裸体视频在线观看乱了中文 | 国产一区视频在线观看免费| 国产精品盗摄久久久| 91久久亚洲| 亚洲福利国产| 亚洲一区二区三区高清不卡| 亚洲一区二区三区在线看| 一本久道久久综合狠狠爱| 亚洲在线视频观看| 国产精品视频999| 一区二区三区高清视频在线观看| 久久精品72免费观看| 香蕉久久一区二区不卡无毒影院| 日韩视频久久| 激情欧美一区二区三区| 久久久天天操| 在线综合亚洲| 亚洲欧美一区二区三区极速播放| 亚洲国产精品www| 在线国产亚洲欧美| 美女免费视频一区| 久久国产一区| 美女黄色成人网| 一区二区三区高清视频在线观看| 欧美综合77777色婷婷|