日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

詳細談談MYSQL中的COLLATE是什么

瀏覽:277日期:2023-10-01 18:48:18
前言

在mysql中執行show create table <tablename>指令,可以看到一張表的建表語句,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關鍵字。這個值后面對應的utf8_unicode_ci是什么意思呢?面試的時候用這個題目考一考DBA,應該可以難倒一大部分人。

COLLATE是用來做什么的?

使用phpmyadmin的開發可能會非常眼熟,因為其中的中文表頭已經給出了答案:

詳細談談MYSQL中的COLLATE是什么

所謂utf8_unicode_ci,其實是用來排序的規則。對于mysql中那些字符類型的列,如VARCHAR,CHAR,TEXT類型的列,都需要有一個COLLATE類型來告知mysql如何對該列進行排序和比較。簡而言之,COLLATE會影響到ORDER BY語句的順序,會影響到WHERE條件中大于小于號篩選出來的結果會影響**DISTINCT**、**GROUP BY**、**HAVING**語句的查詢結果。另外,mysql建索引的時候,如果索引列是字符類型,也會影響索引創建,只不過這種影響我們感知不到。總之,凡是涉及到字符類型比較或排序的地方,都會和COLLATE有關

各種COLLATE的區別

COLLATE通常是和數據編碼(CHARSET)相關的,一般來說每種CHARSET都有多種它所支持的COLLATE,并且每種CHARSET都指定一種COLLATE為默認值。例如Latin1編碼的默認COLLATE為latin1_swedish_ci,GBK編碼的默認COLLATE為gbk_chinese_ci,utf8mb4編碼的默認值為utf8mb4_general_ci。

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

很多COLLATE都帶有_ci字樣,這是Case Insensitive的縮寫,即大小寫無關,也就是說'A'和'a'在排序和比較的時候是一視同仁的。selection * from table1 where field1='a'同樣可以把field1為'A'的值選出來。與此同時,對于那些_cs后綴的COLLATE,則是Case Sensitive,即大小寫敏感的。

在mysql中使用show collation指令可以查看到mysql所支持的所有COLLATE。以utf8mb4為例,該編碼所支持的所有COLLATE如下圖所示。

詳細談談MYSQL中的COLLATE是什么

imgmysql中和utf8mb4相關的所有COLLATE

圖中我們能看到很多國家的語言自己的排序規則。在國內比較常用的是utf8mb4_general_ci(默認)、utf8mb4_unicode_ci、utf8mb4_bin這三個。我們來探究一下這三個的區別:

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

而utf8mb4_unicode_ci和utf8mb4_general_ci對于中文和英文來說,其實是沒有任何區別的。對于我們開發的國內使用的系統來說,隨便選哪個都行。只是對于某些西方國家的字母來說,utf8mb4_unicode_ci會比utf8mb4_general_ci更符合他們的語言習慣一些,general是mysql一個比較老的標準了。例如,德語字母“ß”,在utf8mb4_unicode_ci中是等價于'ss'兩個字母的(這是符合德國人習慣的做法),而在utf8mb4_general_ci中,它卻和字母“s”等價。不過,這兩種編碼的那些微小的區別,對于正常的開發來說,很難感知到。本身我們也很少直接用文字字段去排序,退一步說,即使這個字母排錯了一兩個,真的能給系統帶來災難性后果么?從網上找的各種帖子討論來說,更多人推薦使用utf8mb4_unicode_ci,但是對于使用了默認值的系統,也并沒有非常排斥,并不認為有什么大問題。結論:推薦使用utf8mb4_unicode_ci,對于已經用了utf8mb4_general_ci的系統,也沒有必要花時間改造。

另外需要注意的一點是,從mysql 8.0開始,mysql默認的CHARSET已經不再是Latin1了,改為了utf8mb4(參考鏈接),并且默認的COLLATE也改為了utf8mb4_0900_ai_ci。utf8mb4_0900_ai_ci大體上就是unicode的進一步細分,0900指代unicode比較算法的編號( Unicode Collation Algorithm version),ai表示accent insensitive(發音無關),例如e, è, é, ê 和 ë是一視同仁的。相關參考鏈接1,相關參考鏈接2

COLLATE設置級別及其優先級

設置COLLATE可以在示例級別、庫級別、表級別、列級別、以及SQL指定。實例級別的COLLATE設置就是mysql配置文件或啟動指令中的collation_connection系統變量。

庫級別設置COLLATE的語句如下:

CREATE DATABASE <db_name> DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;如果庫級別沒有設置CHARSET和COLLATE,則庫級別默認的CHARSET和COLLATE使用實例級別的設置。在mysql8.0以下版本中,你如果什么都不修改,默認的CHARSET是Latin1,默認的COLLATE是latin1_swedish_ci。從mysql8.0開始,默認的CHARSET已經改為了utf8mb4,默認的COLLATE改為了utf8mb4_0900_ai_ci。

表級別的COLLATE設置,則是在CREATE TABLE的時候加上相關設置語句,例如:

CREATE TABLE (……) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

如果表級別沒有設置CHARSET和COLLATE,則表級別會繼承庫級別的CHARSET與COLLATE。

列級別的設置,則在CREATE TABLE中聲明列的時候指定,例如

CREATE TABLE (`field1` VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT ’’,……) ……

如果列級別沒有設置CHARSET和COLATE,則列級別會繼承表級別的CHARSET與COLLATE。

最后,你也可以在寫SQL查詢的時候顯示聲明COLLATE來覆蓋任何庫表列的COLLATE設置,不太常用,了解即可:

SELECT DISTINCT field1 COLLATE utf8mb4_general_ci FROM table1;SELECT field1, field2 FROM table1 ORDER BY field1 COLLATE utf8mb4_unicode_ci;

如果全都顯示設置了,那么優先級順序是 SQL語句 > 列級別設置 > 表級別設置 > 庫級別設置 > 實例級別設置。也就是說列上所指定的COLLATE可以覆蓋表上指定的COLLATE,表上指定的COLLATE可以覆蓋庫級別的COLLATE。如果沒有指定,則繼承下一級的設置。即列上面沒有指定COLLATE,則該列的COLLATE和表上設置的一樣。

以上就是關于mysql的COLLATE相關知識。不過,在系統設計中,我們還是要盡量避免讓系統嚴重依賴中文字段的排序結果,在mysql的查詢中也應該盡量避免使用中文做查詢條件。

總結

到此這篇關于詳細談談MYSQL中COLLATE的文章就介紹到這了,更多相關MYSQL COLLATE是什么內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: MySQL 數據庫
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
免费视频亚洲| 亚洲电影有码| 在线日韩中文| 欧美日韩一区二区综合 | 丝袜美腿一区二区三区| 欧美日韩第一| 午夜在线观看免费一区| 亚洲另类视频| 精品免费视频| 色8久久久久| 美女被久久久| 蜜桃视频免费观看一区| 一区在线视频观看| 亚洲欧美日韩在线观看a三区| 亚洲天堂资源| 久久一区二区三区喷水| 欧美日韩国产在线一区| 亚洲我射av| 欧美日韩午夜电影网| 久久不卡国产精品一区二区| 久久97久久97精品免视看秋霞| 在线看片福利| 99日韩精品| 欧美影院精品| a天堂资源在线| 女同性一区二区三区人了人一| 蜜桃免费网站一区二区三区| 国产亚洲欧美日韩精品一区二区三区 | 欧美精品不卡| 国产精品一区二区三区四区在线观看 | 丝袜亚洲另类欧美| 日本亚洲欧洲无免费码在线| 久久99视频| 国产99久久| 日韩精品中文字幕吗一区二区| 久久精品毛片| 激情综合自拍| 91成人福利| 中文字幕色婷婷在线视频| 91精品精品| 日本免费在线视频不卡一不卡二| 国内精品美女在线观看| 在线亚洲免费| 精品三级久久久| 国产精品日韩欧美一区| 国产精品hd| 欧美欧美黄在线二区| 欧美激情久久久久久久久久久| 久久精品一区| 在线日韩视频| 日本三级亚洲精品| 日韩精品一级二级| 涩涩涩久久久成人精品| 中文在线а√天堂| 中文字幕人成乱码在线观看| 欧美国产另类| 欧美激情三区| 五月精品视频| 国产麻豆一区二区三区精品视频| 久久久精品网| 国产精品嫩模av在线| 一本一道久久a久久精品蜜桃| 日韩av中文字幕一区二区 | 亚洲开心激情| 手机在线电影一区| 亚洲精品看片| 中国字幕a在线看韩国电影| 五月激激激综合网色播| 精品三区视频| 蜜臀精品一区二区三区在线观看| 麻豆成人av在线| 日本欧美一区二区| 91av亚洲| 日韩高清成人在线| 日韩理论视频| 国产亚洲亚洲| 精品久久中文| 日韩欧美中文字幕电影| 国产91久久精品一区二区| 国产精品视频一区视频二区| 免费在线观看精品| 福利一区二区免费视频| 日韩精品久久久久久| 欧美国产小视频| 久久精品凹凸全集| 日韩中文字幕一区二区三区| 91精品久久久久久久久久不卡| 久久精品福利| 国产精品第一| 日韩精品电影一区亚洲| 亚洲激情另类| 国产综合婷婷| 日韩欧美精品一区| 国产精品啊啊啊| 日韩av中文字幕一区二区三区| 视频一区中文| 久久精品一区二区不卡| 成人影视亚洲图片在线| 色综合视频一区二区三区日韩| 黄色亚洲在线| 欧洲激情综合| 日韩精品2区| 高清精品久久| 国产一区2区| 欧美成a人片免费观看久久五月天| 91精品国产自产观看在线| 亚洲日本久久| 免费国产亚洲视频| 亚洲在线免费| 亚洲男女自偷自拍| 夜夜嗨av一区二区三区网站四季av| 久久国产日韩| 偷拍精品精品一区二区三区| 国产激情久久| 欧美91在线|欧美| 国产福利亚洲| 美女视频网站久久| 精品中文在线| 国内在线观看一区二区三区| 久久亚洲黄色| 成人影视亚洲图片在线| 97在线精品| 欧美成人精品三级网站| 天堂日韩电影| 国产专区一区| 香蕉久久国产| 深夜日韩欧美| 国产亚洲高清一区| 麻豆视频久久| 麻豆一区二区在线| 超碰在线99| 久久国产小视频| 狠狠干成人综合网| 国产精品美女| 久久国产精品99国产| 蜜臀国产一区二区三区在线播放| 日韩影院免费视频| 亚洲精品日韩久久| 国产日产精品_国产精品毛片| 国产精品亚洲产品| 精品国产18久久久久久二百| 91tv亚洲精品香蕉国产一区| 午夜久久久久| 日韩在线成人| 亚洲精品乱码久久久久久蜜桃麻豆| 婷婷视频一区二区三区| 国产精品一区二区av日韩在线| 国内在线观看一区二区三区| 久久在线视频免费观看| 日av在线不卡| 国产精选一区| 亚洲性色av| 天堂av在线一区| 日本特黄久久久高潮| 国产精品免费不| 91精品蜜臀一区二区三区在线| 蜜臀va亚洲va欧美va天堂 | 91精品蜜臀一区二区三区在线| 9色国产精品| 久久精品凹凸全集| 亚洲天堂一区二区| 亚洲综合精品| 欧美激情91| 久久一区二区三区喷水| 综合精品一区| 欧美日韩视频免费看| 国产乱码午夜在线视频| 久久福利影视| 国产一区日韩| 久久午夜精品| 美女在线视频一区| 另类中文字幕国产精品| 国产一级久久| 麻豆精品视频在线观看免费| 欧美精品激情| 国产精品va| 亚洲一区国产| 精品福利久久久| 在线看片一区| 麻豆理论在线观看| 日韩欧美精品一区二区综合视频| 天堂√8在线中文| 在线国产精品一区| 高清日韩中文字幕| 日韩精品亚洲专区| 人人精品亚洲| 午夜在线一区| 涩涩av在线| 久久国际精品| 蜜臀av免费一区二区三区| 欧美日韩亚洲三区| 久久一区二区三区喷水| 国产剧情一区| 男人操女人的视频在线观看欧美| 成人午夜网址| 日韩avvvv在线播放| 国产精品毛片在线看| 美女av在线免费看| 欧美日韩亚洲一区| 午夜在线精品偷拍|