中文數據問題本質是字符集問題
\xD5\xC5\xD4\xBD代表"張越在"當前編碼下對應的二進制編碼轉換成的十六進制:兩個漢字對應四個字節 GBK
錯誤原因:服務器沒有識別對應的四個字節,服務器認爲數據是UTF8,一個漢字對應三個字節;
所有數據服務器認爲(表現)的一些特性,都是通過服務器端的變量來保存;系統先讀取自己的變量看應該怎麼表現;
查看服務器到底識別哪些字符集 show character set;
服務器識別這麼多字符集,總有一種是服務器默認的和客戶端打交道的字符集show variables like 'character_set%' ; show variables like '%character%'; show variables like '%collation%';
顯示結果:variable_name value
character_set_client utf8 服務器默認客戶端來的數據字符集UTF8
character_set_connection utf8 連接層字符集
character_set_database utf8 當前所在數據庫字符集
character_set_filesystem binary
character_set_results utf8 服務器默認給外部數據的字符集
問題根源:客戶端數據只能是gbk 而服務器認爲是utf8;產生矛盾
解決方案:改變服務器默認的接受字符集爲gbk
set character_set_client=gbk;
查看數據是亂碼,原因:數據來源是服務器,解析數據是客戶端,客戶端只會識別gbk,但是實時服務器給的數據是utf8(三個字節代表一個數字)
解決方案:修改服務器給客戶端的數據字符集爲gbk
set character_set_results=gbk;
注意:set 變量=值 ;修改的只是會話級別的(當前客戶端當次連接有效,關閉失效)
設置服務器對客戶端的字符集的認識:可以使用快捷方式
set names gbk;==>character_set_client character_set_connectioncharacter_set_results
connection連接層:是字符集轉變中間者,統一了效率更高;
校對集問題
校對集:數據比較的方式
校對集三種格式 _bin:binary 二進制比較,區分大小寫
_cs:case sensitive,大小寫敏感,區分大小寫
_ci:case insensitive,大小不寫敏感,不區分大小寫
查看所有校對集show collation;
校對集應用:只有當數據產生比較時,校對集才生效
對比:使用utf8_bin和utf8_general_ci來驗證不同的校對集效果
1.創建不同校對集對應的表
2.插入數據(此時校對集不立即生效)
3.比較,根據某個字段進行排序:order by 字段名 [asc| desc] ; asc升序,默認的 desc降序
例子:create table my_collate_bin(name char(1)) charset utf8 collate utf8_bin;
create table my_collate_ci(name char(1)) charset utf8 collate utf8_general_ci;
insert into my_collate_bin values ('a'),('A'),('b'),('B');
insert into my_collate_ci values ('a'),('A'),('b'),('B');
select * from my_collate_bin order by name;
select * from my_collate_ci order by name;
注意:校對集必須在數據沒有之前聲明好,如果有了數據,再進行校對集修改,修改無效;