程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 10分鐘學會理解和解決MySQL亂碼問題(1)

10分鐘學會理解和解決MySQL亂碼問題(1)

編輯:MySQL綜合教程

10分鐘學會理解和解決MySQL亂碼問題(1)


本文將詳細介紹MySQL亂碼的成因和具體的解決方案

在閱讀本文之前,強烈建議對字符集編碼概念還比較模糊的同學 閱讀下博主之前對相關概念的一篇科普:十分鐘搞清字符集和字符編碼

MySQL出現亂碼的原因

要了解為什麼會出現亂碼,我們就先要理解:從客戶端發起請求,到MySQL存儲數據,再到下次從表取回客戶端的過程中,哪些環節會有編碼/解碼的行為。為了更好的解釋這個過程,博主制作了兩張流程圖,分別對應存入和取出兩個階段。

存入MySQL經歷的編碼轉換過程

上圖中有3次編碼/解碼的過程(紅色箭頭)。三個紅色箭頭分別對應:客戶端編碼,MySQL Server解碼,Client編碼向表編碼的轉換。其中Terminal可以是一個Bash,一個web頁面又或者是一個APP。本文中我們假定 Bash是我們的Terminal,即用戶端的輸入和展示界面。圖中每一個框格對應的行為如下:

  • 在terminal中使用輸入法輸入
  • terminal根據字符編碼轉換成二進制流
  • 二進制流通過MySQL客戶端傳輸到MySQL Server
  • Server通過character-set-client解碼
  • 判斷character-set-client和目標表的charset是否一致
  • 如果不一致則進行一次從client-charset到table-charset的一次字符編碼轉換
  • 將轉換後的字符編碼二進制流存入文件中

從MySQL表中取出數據經歷的編碼轉換過程

上圖有3次編碼/解碼的過程(紅色箭頭)。上圖中三個紅色箭頭分別對應:客戶端解碼展示,MySQL Server根據character-set-client編碼,表編碼向character-set-client編碼的轉換。

  • 從文件讀出二進制數據流
  • 用表字符集編碼進行解碼
  • 將數據轉換為character-set-client的編碼
  • 使用character-set-client編碼為二進制流
  • Server通過網絡傳輸到遠端client
  • client通過bash配置的字符編碼展示查詢結果




  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved