国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

mysql中文亂碼的一些解決方案

2024-07-24 12:42:38
字體:
供稿:網(wǎng)友

   如果你也遇到了這個問題,咱先不談原因,在PC自帶的cmd中(或者是mysql安裝版安裝后的Command Line客戶端,又或者是工作用的SecureCRT)試試效果。進(jìn)入mysql環(huán)境,從頭開始操作。假設(shè)你的客戶端編碼是gbk或者utf8(這么說太不嚴(yán)謹(jǐn)了,怎么能假設(shè)呢,但是一般來說假如安裝后沒動過,cmd是gbk編碼,mysql安裝后的Command Line客戶端沒裝不記得,CRT看看Session Options里面的編碼設(shè)置,一般也會設(shè)置成utf8),執(zhí)行一些語句:

  1. 設(shè)置編碼客戶端、連接、返回結(jié)果的字符集,先設(shè)置成latin1,

mysql中文亂碼的一些解決方案 武林網(wǎng)

  2. 然后執(zhí)行下面的看下各個字符是不是這樣的,

mysql中文亂碼的一些解決方案

  如果你的character_set_client、character_set_connection、character_set_results不是latin1,可以這樣執(zhí)行,把他們單個分別設(shè)置成latin1,比如設(shè)character_set_client,其他兩個一樣,確保這三個均是latin1(第一步的sql語句實際做的就是這件事),

mysql中文亂碼的一些解決方案

  3. 單獨(dú)創(chuàng)建一個數(shù)據(jù)庫db_latin1,當(dāng)然是很簡單的了,測試嘛,創(chuàng)建時就設(shè)置數(shù)據(jù)庫的編碼的為latin1,

mysql中文亂碼的一些解決方案

  4. 在它下面創(chuàng)建一張表tab_latin1,字符集也設(shè)置成latin1,這里不設(shè)置字符也行,數(shù)據(jù)庫級已經(jīng)設(shè)置了,這里只創(chuàng)建一個name字段,

mysql中文亂碼的一些解決方案

  5. 插入一些中文字符到表中,先說明,本機(jī)的cmd編碼是gbk,查看方法是右鍵屬性->選項,看下當(dāng)前代碼頁即可知道,

mysql中文亂碼的一些解決方案

  6. 查看下結(jié)果

mysql中文亂碼的一些解決方案

  看吧,正常顯示中文了~~~

  OK,都到這兒了你就不想知道“為什么我那樣設(shè)置就是不行”么,當(dāng)然得往下看看是不。上圖:

mysql中文亂碼的一些解決方案

  我們知道m(xù)ysql是客戶端-服務(wù)器軟件,每次操作都是客戶端向服務(wù)端發(fā)送請求,然后可能會返回一些結(jié)果,這之間插入的字符經(jīng)過了一系列轉(zhuǎn)換。首先供我們編輯的客戶端本身就有一種編碼,比如PC端的命令行默認(rèn)是gbk,PC自帶notepad新建文本文件默認(rèn)是ANSI,常用的文本編輯器如notepad++,我們可能會設(shè)置默認(rèn)編碼為utf8,就是說在編輯器上編輯,你所看到的本身就是一種編碼了。

  1. 在客戶端編輯后,首先轉(zhuǎn)化為client對應(yīng)的字符集,即上面打印出的character_set_client變量指示的字符集;

  2. 向數(shù)據(jù)庫服務(wù)發(fā)送請求,發(fā)送過程中,轉(zhuǎn)化為connection對應(yīng)連接字符集,即character_set_connection變量對應(yīng)字符集;

  3. 存儲到數(shù)據(jù)庫中,轉(zhuǎn)化為數(shù)據(jù)庫存儲的字符集,可能是server級別(character_set_server)、database級別(character_set_database)或者表級別和列級別(這里還要細(xì)說下);

  4. 數(shù)據(jù)庫收到請求,執(zhí)行查詢得到結(jié)果,再次轉(zhuǎn)化為results對應(yīng)字符集,即character_set_results變量所指,該結(jié)果返回到客戶端上;

  5. 結(jié)果來了,是按照results字符集編碼的,那我們讓這個結(jié)果顯示的客戶端工具它支持什么樣的編碼也很重要,這決定了它如何去解碼結(jié)果。假如這個結(jié)果是utf8編碼,返回給某客戶端了,但這個客戶端只有ANSI編碼,那當(dāng)然不能顯示正常,比如它返回到SecureCRT,結(jié)果顯示不正常,但是CRT支持多種編碼,我們手動將它調(diào)成utf8編碼,那它就又顯示正常了,所以嚴(yán)格來說這一步算不上,只是跟客戶端條件有關(guān),畢竟當(dāng)我們知道后將客戶端調(diào)整成正常的編碼或者本來就支持轉(zhuǎn)換results的編碼后,這一步就不存在了。

  在上面的第3步中,從連接字符集編碼轉(zhuǎn)化為數(shù)據(jù)庫存儲使用的編碼時,要分幾種情況,一般我們在裝mysql時,特別是32位安裝版本時,中間有一個選擇編碼的步驟,大多會選擇utf8編碼,這時系統(tǒng)就可能會把一系列的字符集變量均設(shè)置成了utf8,比如character_set_server、character_set_connection、character_set_database等等。也就是說這個character_set_server變量在你啟動mysql服務(wù)的事先就被設(shè)置好了,我們可以稱它為服務(wù)器級編碼,那我們在建表前,先得創(chuàng)建數(shù)據(jù)庫,在創(chuàng)建數(shù)據(jù)庫時,我們知道可以顯式指定編碼的,比如最開頭時我創(chuàng)建時顯式指定采用latin1字符集,也可以不指定,如果不指定的話,它將采用服務(wù)器級的字符集,即character_set_server,同理在創(chuàng)建表時,也可不指定編碼,不指定的話,采用數(shù)據(jù)庫級編碼,級character_set_database,更加同理在創(chuàng)建表中列字段時也可指定編碼,不指定編碼的話將采用表級別字符集,因此有這么一個繼承關(guān)系在這:

  character_set_server => character_set_database => character set in table(無此變量) => character set column(無此變量)

  mysql創(chuàng)建表可以細(xì)化到這四個層次,不是每一層都必須指定,默認(rèn)使用上一級的字符集(字符校對規(guī)則也是這樣的,collation,稍后說明)。

  那么有沒有可能character_set_server沒有指定呢,如果任何地方都沒指定,特別是非安裝版中,如果忘了,mysql在編譯時默認(rèn)采用latin1,為了應(yīng)對這種情況,特別是非安裝版本中在配置mysql時,經(jīng)常需要手動配置mysql配置文件mysql.ini,其中就有大概這么一項:

mysql中文亂碼的一些解決方案

  在配置文件中默認(rèn)采用的字符集,因此如果指定了character_set_server默認(rèn)就會采用它,這樣其他層次都不指定的話依次繼承。

共2頁上一頁12下一頁
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 高淳县| 德保县| 榆林市| 景德镇市| 金乡县| 鲁甸县| 静安区| 马公市| 夹江县| 咸宁市| 怀化市| 敦化市| 油尖旺区| 日土县| 咸丰县| 伊春市| 湘潭市| 卫辉市| 大足县| 汽车| 东丽区| 五原县| 广平县| 沙田区| 大余县| 海南省| 益阳市| 阳江市| 会泽县| 林甸县| 鲁山县| 河池市| 资中县| 绿春县| 思茅市| 禹州市| 徐水县| 普安县| 绍兴市| 澳门| 镇江市|