站長(zhǎng)資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

        詳解MYSQL中COLLATE的作用及各種COLLATE區(qū)別

        MYSQL中的COLLATE是什么?

        在mysql中執(zhí)行show create table <tablename>指令,可以看到一張表的建表語(yǔ)句,example如下:

        CREATE TABLE `table1` (     `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,     `field1` text COLLATE utf8_unicode_ci NOT NULL COMMENT '字段1',     `field2` varchar(128) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '字段2',     PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8_unicode_ci;

        大部分字段我們都能看懂,但是今天要討論的是COLLATE關(guān)鍵字。這個(gè)值后面對(duì)應(yīng)的utf8_unicode_ci是什么意思呢?面試的時(shí)候用這個(gè)題目考一考DBA,應(yīng)該可以難倒一大部分人。

        COLLATE是用來(lái)做什么的?

        使用phpmyadmin的開(kāi)發(fā)可能會(huì)非常眼熟,因?yàn)槠渲械闹形谋眍^已經(jīng)給出了答案:

        詳解MYSQL中COLLATE的作用及各種COLLATE區(qū)別

        phpmyadmin截圖

        所謂utf8_unicode_ci,其實(shí)是用來(lái)排序的規(guī)則。對(duì)于mysql中那些字符類型的列,如VARCHAR,CHAR,TEXT類型的列,都需要有一個(gè)COLLATE類型來(lái)告知mysql如何對(duì)該列進(jìn)行排序和比較。簡(jiǎn)而言之,COLLATE會(huì)影響到ORDER BY語(yǔ)句的順序,會(huì)影響到WHERE條件中大于小于號(hào)篩選出來(lái)的結(jié)果,會(huì)影響**DISTINCT**、**GROUP BY**、**HAVING**語(yǔ)句的查詢結(jié)果。另外,mysql建索引的時(shí)候,如果索引列是字符類型,也會(huì)影響索引創(chuàng)建,只不過(guò)這種影響我們感知不到。總之,凡是涉及到字符類型比較或排序的地方,都會(huì)和COLLATE有關(guān)。

        各種COLLATE的區(qū)別

        COLLATE通常是和數(shù)據(jù)編碼(CHARSET)相關(guān)的,一般來(lái)說(shuō)每種CHARSET都有多種它所支持的COLLATE,并且每種CHARSET都指定一種COLLATE為默認(rèn)值。例如Latin1編碼的默認(rèn)COLLATE為latin1_swedish_ci,GBK編碼的默認(rèn)COLLATE為gbk_chinese_ci,utf8mb4編碼的默認(rèn)值為utf8mb4_general_ci。

        這里順便講個(gè)題外話,mysql中有utf8和utf8mb4兩種編碼,在mysql中請(qǐng)大家忘記**utf8**,永遠(yuǎn)使用**utf8mb4**。這是mysql的一個(gè)遺留問(wèn)題,mysql中的utf8最多只能支持3bytes長(zhǎng)度的字符編碼,對(duì)于一些需要占據(jù)4bytes的文字,mysql的utf8就不支持了,要使用utf8mb4才行。

        很多COLLATE都帶有_ci字樣,這是Case Insensitive的縮寫,即大小寫無(wú)關(guān),也就是說(shuō)"A"和"a"在排序和比較的時(shí)候是一視同仁的。selection * from table1 where field1="a"同樣可以把field1為"A"的值選出來(lái)。與此同時(shí),對(duì)于那些_cs后綴的COLLATE,則是Case Sensitive,即大小寫敏感的。

        在mysql中使用show collation指令可以查看到mysql所支持的所有COLLATE。以u(píng)tf8mb4為例,該編碼所支持的所有COLLATE如下圖所示。

        詳解MYSQL中COLLATE的作用及各種COLLATE區(qū)別

        mysql中和utf8mb4相關(guān)的所有COLLATE

        圖中我們能看到很多國(guó)家的語(yǔ)言自己的排序規(guī)則。在國(guó)內(nèi)比較常用的是utf8mb4_general_ci(默認(rèn))、utf8mb4_unicode_ci、utf8mb4_bin這三個(gè)。我們來(lái)探究一下這三個(gè)的區(qū)別:

        首先utf8mb4_bin的比較方法其實(shí)就是直接將所有字符看作二進(jìn)制串,然后從最高位往最低位比對(duì)。所以很顯然它是區(qū)分大小寫的。

        而utf8mb4_unicode_ci和utf8mb4_general_ci對(duì)于中文和英文來(lái)說(shuō),其實(shí)是沒(méi)有任何區(qū)別的。對(duì)于我們開(kāi)發(fā)的國(guó)內(nèi)使用的系統(tǒng)來(lái)說(shuō),隨便選哪個(gè)都行。只是對(duì)于某些西方國(guó)家的字母來(lái)說(shuō),utf8mb4_unicode_ci會(huì)比utf8mb4_general_ci更符合他們的語(yǔ)言習(xí)慣一些,general是mysql一個(gè)比較老的標(biāo)準(zhǔn)了。例如,德語(yǔ)字母“?”,在utf8mb4_unicode_ci中是等價(jià)于"ss"兩個(gè)字母的(這是符合德國(guó)人習(xí)慣的做法),而在utf8mb4_general_ci中,它卻和字母“s”等價(jià)。不過(guò),這兩種編碼的那些微小的區(qū)別,對(duì)于正常的開(kāi)發(fā)來(lái)說(shuō),很難感知到。本身我們也很少直接用文字字段去排序,退一步說(shuō),即使這個(gè)字母排錯(cuò)了一兩個(gè),真的能給系統(tǒng)帶來(lái)災(zāi)難性后果么?從網(wǎng)上找的各種帖子討論來(lái)說(shuō),

        贊(1)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
        主站蜘蛛池模板: 97r久久精品国产99国产精| 88国产精品欧美一区二区三区| 国产精品丝袜黑色高跟鞋| 国产精品亚洲欧美大片在线看| 国产精品亚洲аv无码播放| 亚洲国产精品成人久久蜜臀| 99热都是精品久久久久久| 97久久精品无码一区二区| 亚洲麻豆精品国偷自产在线91 | 精品久久久久久久久久久久久久久| 2020亚洲男人天堂精品| 日韩精品无码AV成人观看| 无码人妻一区二区三区精品视频| 国产乱人伦偷精品视频免观看| 亚洲天堂久久精品| 精品国产麻豆免费人成网站| 97精品一区二区视频在线观看| 人妻少妇精品视频二区| 最新国产精品拍自在线观看| 西瓜精品国产自在现线| 男女男精品网站免费观看| 国产系列高清精品第一页| 国产精品亚洲视频| 国产偷窥熟女高潮精品视频| 国产精品国产三级国产| 9re热国产这里只有精品| 99国内精品久久久久久久| 97国产视频精品| 国产69精品久久久久99| 国产精品亚洲高清一区二区| 国产一区麻豆剧传媒果冻精品| 国产原创精品 正在播放| 久久精品中文字幕一区| 欧美精品亚洲人成在线观看| 日本熟妇亚洲欧美精品区| 伊在人亚洲香蕉精品区麻豆| 自拍偷自拍亚洲精品第1页 | 国产精品福利网站导航| 91精品国产色综合久久| 国产成人精品男人的天堂538| 国产伦精品一区二区三区女|