mysql中文亂碼的一些解決方案_MySQL教程
推薦:sql寫注冊表語句例句首先開啟沙盤模式: exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',1 讀注冊表 exec master..xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon','Userinit
如果你也遇到了這個問題,咱先不談原因,在PC自帶的cmd中(或者是mysql安裝版安裝后的Command Line客戶端,又或者是工作用的SecureCRT)試試效果。進入mysql環境,從頭開始操作。假設你的客戶端編碼是gbk或者utf8(這么說太不嚴謹了,怎么能假設呢,但是一般來說假如安裝后沒動過,cmd是gbk編碼,mysql安裝后的Command Line客戶端沒裝不記得,CRT看看Session Options里面的編碼設置,一般也會設置成utf8),執行一些語句:
1. 設置編碼客戶端、連接、返回結果的字符集,先設置成latin1,
2. 然后執行下面的看下各個字符是不是這樣的,
如果你的character_set_client、character_set_connection、character_set_results不是latin1,可以這樣執行,把他們單個分別設置成latin1,比如設character_set_client,其他兩個一樣,確保這三個均是latin1(第一步的sql語句實際做的就是這件事),
3. 單獨創建一個數據庫db_latin1,當然是很簡單的了,測試嘛,創建時就設置數據庫的編碼的為latin1,
4. 在它下面創建一張表tab_latin1,字符集也設置成latin1,這里不設置字符也行,數據庫級已經設置了,這里只創建一個name字段,
5. 插入一些中文字符到表中,先說明,本機的cmd編碼是gbk,查看方法是右鍵屬性->選項,看下當前代碼頁即可知道,
6. 查看下結果
看吧,正常顯示中文了~~~
OK,都到這兒了你就不想知道“為什么我那樣設置就是不行”么,當然得往下看看是不。上圖:
我們知道mysql是客戶端-服務器軟件,每次操作都是客戶端向服務端發送請求,然后可能會返回一些結果,這之間插入的字符經過了一系列轉換。首先供我們編輯的客戶端本身就有一種編碼,比如PC端的命令行默認是gbk,PC自帶notepad新建文本文件默認是ANSI,常用的文本編輯器如notepad++,我們可能會設置默認編碼為utf8,就是說在編輯器上編輯,你所看到的本身就是一種編碼了。
1. 在客戶端編輯后,首先轉化為client對應的字符集,即上面打印出的character_set_client變量指示的字符集;
2. 向數據庫服務發送請求,發送過程中,轉化為connection對應連接字符集,即character_set_connection變量對應字符集;
3. 存儲到數據庫中,轉化為數據庫存儲的字符集,可能是server級別(character_set_server)、database級別(character_set_database)或者表級別和列級別(這里還要細說下);
4. 數據庫收到請求,執行查詢得到結果,再次轉化為results對應字符集,即character_set_results變量所指,該結果返回到客戶端上;
5. 結果來了,是按照results字符集編碼的,那我們讓這個結果顯示的客戶端工具它支持什么樣的編碼也很重要,這決定了它如何去解碼結果。假如這個結果是utf8編碼,返回給某客戶端了,但這個客戶端只有ANSI編碼,那當然不能顯示正常,比如它返回到SecureCRT,結果顯示不正常,但是CRT支持多種編碼,我們手動將它調成utf8編碼,那它就又顯示正常了,所以嚴格來說這一步算不上,只是跟客戶端條件有關,畢竟當我們知道后將客戶端調整成正常的編碼或者本來就支持轉換results的編碼后,這一步就不存在了。
在上面的第3步中,從連接字符集編碼轉化為數據庫存儲使用的編碼時,要分幾種情況,一般我們在裝mysql時,特別是32位安裝版本時,中間有一個選擇編碼的步驟,大多會選擇utf8編碼,這時系統就可能會把一系列的字符集變量均設置成了utf8,比如character_set_server、character_set_connection、character_set_database等等。也就是說這個character_set_server變量在你啟動mysql服務的事先就被設置好了,我們可以稱它為服務器級編碼,那我們在建表前,先得創建數據庫,在創建數據庫時,我們知道可以顯式指定編碼的,比如最開頭時我創建時顯式指定采用latin1字符集,也可以不指定,如果不指定的話,它將采用服務器級的字符集,即character_set_server,同理在創建表時,也可不指定編碼,不指定的話,采用數據庫級編碼,級character_set_database,更加同理在創建表中列字段時也可指定編碼,不指定編碼的話將采用表級別字符集,因此有這么一個繼承關系在這:
character_set_server => character_set_database => character set in table(無此變量) => character set column(無此變量)
mysql創建表可以細化到這四個層次,不是每一層都必須指定,默認使用上一級的字符集(字符校對規則也是這樣的,collation,稍后說明)。
那么有沒有可能character_set_server沒有指定呢,如果任何地方都沒指定,特別是非安裝版中,如果忘了,mysql在編譯時默認采用latin1,為了應對這種情況,特別是非安裝版本中在配置mysql時,經常需要手動配置mysql配置文件mysql.ini,其中就有大概這么一項:
在配置文件中默認采用的字符集,因此如果指定了character_set_server默認就會采用它,這樣其他層次都不指定的話依次繼承。
分享:sql檢測是否為SA權限語句檢測是否為SA權限 and 1=(select IS_SRVROLEMEMBER('sysadmin'));-- And char(124)%2BCast(IS_SRVROLEMEMBER(0x730079007300610064006D0069006E00) as varchar(1))%2Bchar(124)=1 --
- 相關鏈接:
- 教程說明:
MySQL教程-mysql中文亂碼的一些解決方案。