MySQL的字符集是怎樣的,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比興和網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式興和網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋興和地區(qū)。費(fèi)用合理售后完善,10余年實(shí)體公司更值得信賴。
關(guān)于MYSQL的字符集,系統(tǒng)里面有很多個(gè)變量設(shè)置,很多初學(xué)者都不太搞得清楚,包括我自己也是.
所以在這里寫點(diǎn)東西,希望把這幾個(gè)東西的關(guān)系搞清楚.
MYSQL的字符集變量可以通過(guò)以下命令得到:
show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | gbk |
| character_set_connection | gbk |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
MYSQL的字符集變量其實(shí)可以分為兩類,
一類是關(guān)于創(chuàng)建OBJECTS時(shí)要用到的.
character_set_database
character_set_server
一類是在服務(wù)器處理連接的時(shí)候要用到的.
character_set_client
character_set_connection
character_set_results
我們主要關(guān)注的是處理連接的字符集.
關(guān)注字符集問(wèn)題,那你肯定是遇到了亂碼的問(wèn)題. 其實(shí)解決亂碼問(wèn)題在網(wǎng)上一搜一大堆.
如果能做到, 應(yīng)用/MYSQL.CLENT/MYSQL.CONNETION/表/MYSQL.RESULT 的字符集一致,存取數(shù)據(jù)肯定沒(méi)有問(wèn)題.
我在這里把這三個(gè)連接字符集的關(guān)系理理.
經(jīng)過(guò)多次的測(cè)試,我把MYSQL處理字符的過(guò)程主要?dú)w納為:
例: WINDOWS客戶端CHARSET=GBK,輸入"中" , 通過(guò)WINDOWS.GBK轉(zhuǎn)碼為 $a = D6D0,
================================================================================
# 服務(wù)器收到CLIENT送來(lái)的值"D6D0", 并認(rèn)為"D6D0"是$MYSQL.character_set_client 指定字符集的數(shù)據(jù).
# 從 $MYSQL.character_set_client 轉(zhuǎn)化---> $MYSQL.character_set_connection (如果字符集一樣就不轉(zhuǎn)換)
if 轉(zhuǎn)換成功 ; then
$a = $MYSQL.character_set_client.code
else
$a = 3f (在這個(gè)環(huán)節(jié)不會(huì)報(bào)錯(cuò)!)
fi
# 從 $MYSQL.character_set_connection 轉(zhuǎn)化---> $TABLES.character_set (如果字符集一樣也會(huì)檢查一次)
if 轉(zhuǎn)換成功 ; then
$a = $MYSQL.character_set_client.code , 并存入表
else
$a = 3f , 并報(bào)錯(cuò): Incorrect string value
$a = 20 ($MYSQL.character_set_connection = $TABLES.character_set 的情況)
fi
# 從數(shù)據(jù)庫(kù)取數(shù)據(jù).
# 從 $TABLES.character_set --> $MYSQL.character_set_result
if 轉(zhuǎn)換成功 ; then
$a = $MYSQL.character_set_result.code , 正常顯示
else
$a = 3f/亂碼 , 顯示: ?或者亂碼
fi========================================================================================
以下是我測(cè)試過(guò)程中記錄的各種情況及報(bào)錯(cuò)信息,以便大家分析:
(在這里我特意用了SSHTERM的兩種字符集進(jìn)行測(cè)試. 我們可以把它理解為應(yīng)用.)
| SSHTERM | CHAR_client | CHAR_connection | tutf_dump | tgbk_dump | tlatin1_dump | tutf_warning | tgbk_warning | tlatin1_warning |
| gbk | utf8 | utf8 | 20 | 3f | 3f | Incorrect 'xD6xD0' 存入表UTF8轉(zhuǎn)UTF8,這個(gè)環(huán)節(jié)字符集一樣也轉(zhuǎn)換一次.但在源字符集中沒(méi)找到.返回"空" | Incorrect 'xD6xD0' 存入表,用UTF8轉(zhuǎn)GBK時(shí)報(bào)錯(cuò) | Incorrect 'xD6xD0' 存入表,用UTF8轉(zhuǎn)LATIN1時(shí)報(bào)錯(cuò) |
| gbk | gbk | e4b8ad | d6d0 | 3f | 正常 | 正常 | Incorrect 'xD6xD0' 存入表時(shí)用GBK轉(zhuǎn)LATIN1時(shí)報(bào)錯(cuò) | |
| D6D0 | latin1 | latin1 | c396c390 | 3f3f | d6d0 | 正常:(存了UTF8的D6D0) 如果以LATIN1取還是"D6D0" | Incorrect 'xD6xD0' LATIN1轉(zhuǎn)GBK報(bào)錯(cuò) | 正常 |
| gbk | utf8 | e4b8ad | d6d0 | 3f | 正常 | 正常 | Incorrect xE4xB8xAD 存入表,用UTF8轉(zhuǎn)LATIN1時(shí)報(bào)錯(cuò) | |
| utf8 | gbk | 3f | 3f | 3f | CLIENT向CONN轉(zhuǎn)換時(shí)已經(jīng)丟了數(shù)據(jù)成3F,這中間的轉(zhuǎn)換不會(huì)報(bào)錯(cuò) | |||
| utf8 | gbk | gbk | e6b693 | e4b8 | 3f | Data truncated "E4B8AD"只取了_GBK "E4B8" | Incorrect 'xAD "E4B8AD"被兩分了兩段,而AD沒(méi)能轉(zhuǎn)換成功. | Incorrect 'xE4xB8xAD' |
| 在CONN向表轉(zhuǎn)換的時(shí)候,上面兩個(gè)的處理結(jié)果為什么不一樣呢? | ||||||||
| utf8 | utf8 | e4b8ad | d6d0 | 3f | 正常 | 正常 | Incorrect xE4xB8xAD | |
| E4B8AD | gbk | utf8 | e6b693 | e4b8 | 3f | CLENT轉(zhuǎn)CONN數(shù)據(jù)被截取, 但這樣的處理不會(huì)報(bào)錯(cuò). | CLENT轉(zhuǎn)CONN數(shù)據(jù)被截取, 但這樣的處理不會(huì)報(bào)錯(cuò). | Incorrect 'xE6xB6x93' |
| utf8 | gbk | e4b8ad | d6d0 | 3f | 正常 | 正常 | Incorrect 'xD6xD0' | |
| latin1 | latin1 | c3a4c2b8c2ad | 3f3f3f | e4b8ad | 理論上這是"E4B8AD"UTF8的CODE,但又有點(diǎn)不像 | xE4xB8xAD LATIN1向GBK轉(zhuǎn)不成功 | 正常 | |
上表中,只要DUMP結(jié)果為e4b8ad/d6d0,說(shuō)明數(shù)據(jù)存儲(chǔ)都是正常的.而且可以正常讀取.
DUMP結(jié)果為c396c390的情況比較特殊.讀者稍加分析應(yīng)該還是能明白的.(其實(shí)就是原存原取).
相關(guān)命令:
創(chuàng)建測(cè)試表:
create table tutf (name char(10)) engine=myisam default character set=utf8 ;
create table tgbk (name char(10)) engine=myisam default character set=gbk ;
create table tlat (name char(10)) engine=myisam default character set=latin1 ;
設(shè)置相關(guān)字符集:
set character_set_client=gbk ;
set character_set_connection=utf8;
set character_set_results=latin1;
插入并DUMP數(shù)據(jù):
truncate table tutf;truncate table tgbk;truncate table tlat;
insert into tutf values ('中'); show warnings ;
insert into tgbk values ('中'); show warnings ;
insert into tlat values ('中'); show warnings ;
system hexdump /home/mysql/data/test/tutf.MYD ;
system hexdump /home/mysql/data/test/tgbk.MYD ;
system hexdump /home/mysql/data/test/tlat.MYD ;
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。
新聞標(biāo)題:MYSQL的字符集是怎樣的
分享地址:http://chinadenli.net/article42/jhpdhc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、企業(yè)網(wǎng)站制作、ChatGPT、做網(wǎng)站、外貿(mào)建站、服務(wù)器托管
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)