2018-07-03

轉(zhuǎn)載自:
MySQL 的 collation

在以前用oracle的時候,很少關(guān)于它的collation方法,但是在mysql中爪飘,這點不加注意的話,卻有可能會出現(xiàn)問題拉背。

問題是這樣的:
一張test的表师崎,字符集采用的latin1。

select to_id from test where to_id='cn象王';
+---------------+
| to_id |
+---------------+
| cn陶
陶 |
| cn象_王 |
+---------------+
2 rows in set (0.00 sec)

取cn象王的數(shù)據(jù),居然把cn陶陶的數(shù)據(jù)也取回來了椅棺。

這顯然是不允許的犁罩。

查看它們的編碼:

(root@im_offlog1a)[test]> select hex('cn陶陶');
+----------------+
| hex('cn陶
陶') |
+----------------+
| 636ECCD55FCCD5 |
+----------------+
1 row in set (0.00 sec)

(root@im_offlog1a)[test]> select hex('cn象王');
+----------------+
| hex('cn象
王') |
+----------------+
| 636ECFF35FCDF5 |
+----------------+
1 row in set (0.00 sec)

編碼的確是不一樣的,但是為什么mysql會認為這兩條記錄是一樣的呢两疚?

一開始我們就把問題定位于collation引起的問題床估。

show variables查看
| collation_connection | latin1_swedish_ci
| collation_database | latin1_swedish_ci
| collation_server | latin1_swedish_ci

手工把這些參數(shù)修改為latin1_bin,結(jié)果居然一樣诱渤。這下感覺真是奇怪了丐巫。

這里先解釋一下mysql collation的命名規(guī)則:
它們以其相關(guān)的字符集名開始,通常包括一個語言名勺美,并且以_ci(大小寫不敏感)递胧、_cs(大小寫敏感)或_bin(二元)結(jié)束

比如latin1字符集有以下幾種校正規(guī)則:

校對規(guī)則 含義
latin1_german1_ci 德國DIN-1
latin1_swedish_ci 瑞典/芬蘭
latin1_danish_ci 丹麥/挪威
latin1_german2_ci 德國 DIN-2
latin1_bin 符合latin1編碼的二進制
latin1_general_ci 多種語言(西歐)
latin1_general_cs 多種語言(西歐ISO),大小寫敏感
latin1_spanish_ci 現(xiàn)代西班牙

最后我們將表格重建,手工指定表格級別的collation為latin1_bin赡茸。
這個問題就得到了解決缎脾。

那么問題又來了,為什么我前面手工測試latin1_bin時不生效呢坛掠?

原來MySQL按照下面的方式選擇表字符集和 校對規(guī)則:
如果指定了CHARACTER SET X和COLLATE Y赊锚,那么采用CHARACTER SET X和COLLATE Y。
如果指定了CHARACTER SET X而沒有指定COLLATE Y屉栓,那么采用CHARACTER SET X和CHARACTER SET X的默認校對規(guī)則舷蒲。
否則,采用服務(wù)器字符集和服務(wù)器校對規(guī)則友多。

而我們在建表的時候指定了character set牲平,所以它永遠是采用對應(yīng)的默認的校對規(guī)則。

當然我們其實也沒必要重建表格域滥,只需要alter table db_allot CONVERT TO CHARACTER SET latin1 COLLATE latin1_bin這樣轉(zhuǎn)換即可纵柿。

另外建議collation都盡量采用字符集相應(yīng)的bin類型的校對規(guī)則蜈抓,這樣不容易出錯。

再說說我自己的體會

覺得 character set latin1 collate latin1_bin 就是老版的 VARCHAR BINARY 的改進昂儒,只是新版的先用 character set 定字符集沟使,再用此字符集名字加 _bin 定校對規(guī)則為二進制的,從而確保中文查詢正確渊跋。
再測試了一下腊嗡,把此字段屬性改為不帶 BINARY 的
ALTER TABLE comment_content_1_01 CHANGE thread thread VARCHAR( 50 ) DEFAULT NULL
然后再看表結(jié)構(gòu)確實變成 thread varchar(50) default NULL, 即不帶 character set latin1 collate latin1_bin 了,可見character set latin1 collate latin1_bin 就是老版的 VARCHAR BINARY 的改進拾酝。

此外還讀到更方便的做法燕少,不用逐個改字段屬性,而只要表格級別的collation為latin1_bin就行了蒿囤。
測試:
alter table comment_content_1_01 CONVERT TO CHARACTER SET latin1 COLLATE latin1_bin
后客们,

再導出表結(jié)構(gòu)

CREATE TABLE comment_content_1_01 (
content_id int(11) NOT NULL auto_increment,
thread varchar(50) collate latin1_bin default NULL,
uname varchar(100) collate latin1_bin default NULL,
nick varchar(100) collate latin1_bin default NULL,
uid int(11) unsigned default NULL,
content text collate latin1_bin,
post_time datetime default NULL,
post_ip int(10) unsigned default NULL,
status enum('unaudit','normal','deleted') collate latin1_bin NOT NULL default 'unaudit',
PRIMARY KEY (content_id)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_bin;

即便原來沒定各字段的 collate,現(xiàn)在也全都是 collate latin1_bin 了材诽。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末底挫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子岳守,更是在濱河造成了極大的恐慌凄敢,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件湿痢,死亡現(xiàn)場離奇詭異涝缝,居然都是意外死亡,警方通過查閱死者的電腦和手機譬重,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門拒逮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人臀规,你說我怎么就攤上這事滩援。” “怎么了塔嬉?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵玩徊,是天一觀的道長。 經(jīng)常有香客問我谨究,道長恩袱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任胶哲,我火速辦了婚禮畔塔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己澈吨,他們只是感情好把敢,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著谅辣,像睡著了一般修赞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上桑阶,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天榔组,我揣著相機與錄音,去河邊找鬼联逻。 笑死,一個胖子當著我的面吹牛检痰,可吹牛的內(nèi)容都是我干的包归。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼铅歼,長吁一口氣:“原來是場噩夢啊……” “哼公壤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起椎椰,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤厦幅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后慨飘,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體确憨,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年瓤的,在試婚紗的時候發(fā)現(xiàn)自己被綠了休弃。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡圈膏,死狀恐怖塔猾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情稽坤,我是刑警寧澤丈甸,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站尿褪,受9級特大地震影響睦擂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜茫多,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一祈匙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦夺欲、人聲如沸跪帝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伞剑。三九已至,卻和暖如春市埋,著一層夾襖步出監(jiān)牢的瞬間黎泣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工缤谎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留抒倚,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓坷澡,卻偏偏與公主長得像托呕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子频敛,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容