set names utf8的內部執行原理

2021-06-18 12:49:26 字數 1979 閱讀 5003

摘要: 解決亂碼的方法,我們經常使用set names utf8,那麼為什麼加上這句**就可以解決了呢?下面跟著我一起來深入set names utf8的內部執行原理先說mysql的字符集問題。windows下可通過修改my.ini內的php**default-char ...

解決亂碼的方法,我們經常使用「set names utf8」,那麼為什麼加上這句**就可以解決了呢?下面跟著我一起來深入set names utf8的內部執行原理

先說mysql的字符集問題。windows下可通過修改my.ini內的

php**

[mysql]  

default-character-set=utf8    //客戶端的預設字符集

[mysqld]

default-character-set=utf8    //伺服器端預設的字符集

假設我們把兩個都設為utf8,然後在mysql command line client裡面輸入「show variebles like「character_set_%」;」,可看到如下字元:

character_set_client   latin1

character_set_connection    latin1

character_set_database     utf8

character_set_results    latin1

character_set_server   utf8

character_set_system     utf8

要是我們通過採用utf-8的php程式從資料庫裡讀取資料,很有可能是一串「?????」或者是其他亂碼。

解決辦法是,在連線資料庫之後,讀取資料之前,先執行一項查詢「set names utf8」,即在php裡為

mysql_query("set names utf8");    

//該句話一定要放在資料庫伺服器連線語句【$connection=mysql_connect($db_host,$db_user,$db_psw)or die("連線伺服器失敗");】之後

即可顯示正常(只要資料庫裡資訊的字元正常)。

到mysql命令列輸入「set names utf8;」,然後執行「show variebles like「character_set_%」;」,發現原來為latin1的那些變數「character_set_client」、「character_set_connection」、「character_set_results」的值全部變為utf8了,原來是這3個變數在搗蛋。

查閱手冊,上面那句等於:

set character_set_client = utf8;       

set character_set_results = utf8;      

set character_set_connection = utf8;  

看看這3個變數的作用:

資訊輸入路徑:client→connection→server;

資訊輸出路徑:server→connection→results。

換句話說,每個路徑要經過3次改變字符集編碼。以出現亂碼的輸出為例,server裡utf8的資料,傳入connection轉為latin1,傳入results轉為latin1,utf-8頁面又把results轉過來。如果兩種字符集不相容,比如latin1和utf8,轉化過程就為不可逆的,破壞性的。

但這裡要宣告一點,「set names utf8」作用只是臨時的,mysql重啟後就恢復預設了。

接下來就說到mysql在伺服器上的配置問題了。豈不是我們每次對資料庫讀寫都得加上「set namesutf8」,以保證資料傳輸的編碼一致?能不能通過配置mysql來達到那三個變數預設就為我們要想的字符集?手冊上沒說,我在網上也沒找到答案。所以,從伺服器配置的角度而言,是沒辦法省略掉那行**的。

總結:為了讓你的網頁能在更多的伺服器上正常地顯示,還是加上「set names utf8」吧,即使你現在沒有加上這句也能正常訪問。

複習8 內部類

示例 package day20191106 public class inclass 靜態內部類 匿名內部類 最常見,最實用 區域性內部類 已被淘汰 成員內部類是什麼 示例package day20191106 public class clas ample public int a public...

物件導向8 內部類

內部類 在乙個類中定義另乙個類,內部類 舉例 在a類中定義了乙個b類,b就是a類的內部類,a類叫做外部類 內部類的分類 內部類的訪問特點 外部類 class a public void method 測試類 1.可以直接訪問外部類的成員,包括私有 2.不能直接訪問內部類的成員,需要在內部類物件,通過...

STM8S 操作內部EEPROM

對於stm8s103f3這款晶元來講,存在640個位元組的eeprom,當然如果有外部eeprom,自然是不會使用到內部的eeprom的。但小東西也有大用途,例如做無線應用時,減少成本的情況下,還能儲存一些特定設定,如 休眠時間,工作頻率,輸出功率,密碼等。下圖所示,stm8s系列eeprom大小一...