新聞中心
MySQL客戶端和服務(wù)器是怎么通信的?
1.首先請(qǐng)求會(huì)被MySQL客戶端編碼為字節(jié)序列之后通過(guò)網(wǎng)絡(luò)傳輸?shù)椒?wù)器。

10多年的霍爾果斯網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。營(yíng)銷(xiāo)型網(wǎng)站建設(shè)的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整霍爾果斯建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“霍爾果斯網(wǎng)站設(shè)計(jì)”,“霍爾果斯網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
對(duì)于MySQL自帶的客戶端來(lái)說(shuō),這個(gè)編碼過(guò)程使用的字符集和我們使用的操作系統(tǒng)的默認(rèn)字符集是一樣的,類Unix系統(tǒng)的默認(rèn)字符集就是utf8,Windows系統(tǒng)的默認(rèn)字符集就是gbk。
啟動(dòng)MySQL客戶端時(shí),MySQL客戶端就會(huì)檢測(cè)到這個(gè)操作系統(tǒng)使用的是utf8字符集,并將客戶端默認(rèn)字符集設(shè)置為utf8。如果MySQL不支持自動(dòng)檢測(cè)到的操作系統(tǒng)當(dāng)前正在使用的字符集,或者在某些情況下不允許自動(dòng)檢測(cè)的話,MySQL會(huì)使用它自己的內(nèi)建的默認(rèn)字符集作為客戶端默認(rèn)字符集。這個(gè)內(nèi)建的默認(rèn)字符集在MySQL 5.7以及之前的版本中是latin1,在MySQL 8.0中修改為了utf8mb4。
如果我們?cè)趩?dòng)MySQL客戶端是使用了default-character-set啟動(dòng)參數(shù),那么客戶端的默認(rèn)字符集將不再檢測(cè)操作系統(tǒng)當(dāng)前正在使用的字符集,而是直接使用啟動(dòng)參數(shù)default-character-set所指定的值。比方說(shuō)我們使用如下命令來(lái)啟動(dòng)客戶端:
mysql --default-character-set=utf8
那么不論我們使用什么操作系統(tǒng),操作系統(tǒng)目前使用的字符集是什么,我們都將會(huì)以u(píng)tf8作為MySQL客戶端的默認(rèn)字符集。
2.服務(wù)器收到字節(jié)序列請(qǐng)求之后,會(huì)認(rèn)為該字節(jié)串是按照character_set_client系統(tǒng)變量編碼的,之后將其從character_set_client轉(zhuǎn)換到character_set_connection,再進(jìn)行更深入的處理。
3.最后將響應(yīng)發(fā)送至客戶端時(shí),又會(huì)按照character_set_results進(jìn)行編碼。
4.客戶端收到響應(yīng)字節(jié)串之后,按照本客戶端規(guī)定的字符集進(jìn)行解碼。
對(duì)于MySQL自帶的客戶端來(lái)說(shuō),這個(gè)解碼過(guò)程使用的字符集和我們使用的操作系統(tǒng)的默認(rèn)字符集是一樣的,類Unix系統(tǒng)的默認(rèn)字符集就是utf8,Windows系統(tǒng)的默認(rèn)字符集就是gbk。
|
系統(tǒng)變量 |
描述 |
|
MySQL客戶端字符集 |
MySQL客戶端字符集 |
|
character_set_client |
服務(wù)器解碼請(qǐng)求時(shí)使用的字符集 (服務(wù)器認(rèn)為請(qǐng)求是按照該系統(tǒng)變量指定的字符集進(jìn)行編碼的) |
|
character_set_connection |
服務(wù)器處理請(qǐng)求時(shí)會(huì)把請(qǐng)求字符串從character_set_client轉(zhuǎn)為character_set_connection |
|
character_set_results |
服務(wù)器向客戶端返回?cái)?shù)據(jù)時(shí)使用的字符集 (服務(wù)器采用該系統(tǒng)變量指定的字符集對(duì)返回給客戶端的字符串進(jìn)行編碼) |
從通信轉(zhuǎn)碼流程來(lái)看,要保證沒(méi)有亂碼出現(xiàn):
character_set_client、character_set_connection和character_set_result這三個(gè)系統(tǒng)變量應(yīng)該和客戶端的默認(rèn)字符集相同即可。
SET names命令可以一次性修改這三個(gè)系統(tǒng)變量。
實(shí)驗(yàn)驗(yàn)證
數(shù)據(jù)庫(kù)字符集:
1.客戶端發(fā)送請(qǐng)求時(shí)會(huì)將字符'我'按照utf8進(jìn)行編碼,也就是:0xE68891。
2.服務(wù)器收到請(qǐng)求后發(fā)現(xiàn)有前綴_gbk,則不會(huì)將其后邊的字節(jié)0xE68891進(jìn)行從character_set_client到character_set_connection的轉(zhuǎn)換,而是直接把0xE68891認(rèn)為是某個(gè)字符串由gbk編碼后得到的字節(jié)序列。
3.再把上述0xE68891從gbk轉(zhuǎn)換為character_set_results,也就是utf8。0xE688在gbk中代表漢字'鎴',而0x91無(wú)法解碼(我們可以看到上述查詢結(jié)果中有1個(gè)warning)。
結(jié)論
解決亂碼問(wèn)題,要從客戶端到服務(wù)器通信流程中的字符集編碼、轉(zhuǎn)碼、解碼來(lái)分析是哪一步的問(wèn)題。
一般情況下,保證:
- character_set_client
- character_set_results
- character_set_connection
- 客戶端的字符集編碼
當(dāng)其一致時(shí)就可解決亂碼問(wèn)題。
網(wǎng)站欄目:MySQL亂碼問(wèn)題如何排查
本文來(lái)源:http://m.5511xx.com/article/dpgigcg.html


咨詢
建站咨詢
