摘要: 解決亂碼的方法,我們經常使用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大小一...