這篇文章帶給大家的內容是關於MySQL亂碼的原因和設定UTF8資料格式的方法介紹,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
MySQL使用時,有一件很痛苦的事情一定是結果亂碼。將編碼格式都設為UTF8可以解決這個問題,我們今天來說下為什麼要這麼設置,以及怎麼設置。
MySQL字元格式
字元集
在程式語言中,我們為了防止中文亂碼,會使用unicode對中文字元做處理,而為了降低網路頻寬和節省儲存空間,我們使用UTF8進行編碼。對這兩者有什麼不同不夠了解的同學,可以參考Unicode字符集和UTF8編碼編碼的前世今生這篇文章。
同樣在MySQL中,我們也會有這樣的處理,我們可以查看目前資料庫設定的編碼方式(字元集):
mysql> show variables like '%char%'; +--------------------------+----------------------------------+ | Variable_name | Value | +--------------------------+----------------------------------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/local/mysql/share/charsets/ | +--------------------------+----------------------------------+ 8 rows in set (0.00 sec)
表中就是目前設定的字元集,先看不用關注的幾個值:
character_set_filesystem | binary:檔案系統上的儲存格式,預設為binary(二進位)
character_set_system | utf8:系統的儲存格式,預設為utf8
character_sets_dir | /usr/local/mysql/share/charsets/:可以使用的字元集的檔案路徑
#剩下的幾個就是日常影響讀取和寫入亂碼的參數:
- character_set_client:客戶端請求資料的字元集
- character_set_connection:從客戶端接收到數據,然後傳送的字元集
- character_set_database:預設資料庫的字元集;如果沒有預設資料庫,使用character_set_server欄位
#- character_set_results:結果集的字元集
- character_set_server:資料庫伺服器的預設字元集
1、客戶端請求資料庫數據,發送的資料使用character_set_client字元集2、MySQL實例收到客戶端發送的資料後,將其轉換為character_set_connection字元集 3.進行內部操作時,將資料字元集轉換為內部操作字元集:(1)使用每個資料欄位的character set設定值(2)若不存在,使用對應資料表的default character set設定值(3)若不存在,使用對應資料庫的default character set設定值(4)若不存在,使用character_set_server設定值4、將操作結果值從內部操作字元集轉換為character_set_results字元序說字元序之前,我們需要了解一點基礎知識:字元(Character)是指人類語言中最小的表義符號。例如'A'、'B'等;
mysql> show variables like 'collation%'; +----------------------+-------------------+ | Variable_name | Value | +----------------------+-------------------+ | collation_connection | latin1_swedish_ci | | collation_database | latin1_swedish_ci | | collation_server | latin1_swedish_ci | +----------------------+-------------------+ 3 rows in set (0.00 sec)跟utf8對應的常用字元序是:utf8_unicode_ci/utf8_general_ci和utf8_bin等,那麼他們的差別是什麼呢? 1、_bin是用二進位儲存並比較,區別大小寫,儲存二進位內容時使用2、utf8_general_ci:校對速度快,但準確度稍差,使用中英文時使用3、utf8_unicode_ci:準確度高,但校對速度稍慢,使用德法俄等外語時使用詳細的區別可以參考
Mysql中的排序規則utf8_unicode_ci、utf8_general_ci的區別總結。
修改字元集與字元序
如果在MySQL連線時,出現了亂碼的問題,那麼基本上可以確定是各個字元集/序設定不統一的原因。 MySQL預設的latin1格式不支援中文,由於我們在中國,所以選擇對中文和各語言支援都非常完善的utf8格式。所以,我們需要將需要關注的字元集和字元序都修改為utf8格式。
你也可以選擇utf8mb4格式,這個格式支援保存emoji
以上是MySQL亂碼的原因與設定UTF8資料格式的方法介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!