电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

詳細談談MYSQL中的COLLATE是什么

瀏覽:142日期: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 數據庫
相關文章:
主站蜘蛛池模板: 成都APP开发-成都App定制-成都app开发公司-【未来久】 | 天坛家具官网| 全自动包衣机-无菌分装隔离器-浙江迦南科技股份有限公司 | 卧涛科技有限公司科技项目申报公司|高新技术企业申报|专利申请 | 数码管_LED贴片灯_LED数码管厂家-无锡市冠卓电子科技有限公司 | 礼仪庆典公司,礼仪策划公司,庆典公司,演出公司,演艺公司,年会酒会,生日寿宴,动工仪式,开工仪式,奠基典礼,商务会议,竣工落成,乔迁揭牌,签约启动-东莞市开门红文化传媒有限公司 | 棕刚玉_白刚玉_铝酸钙-锐石新材料 | 金属检测机_金属分离器_检针验针机_食品药品金属检探测仪器-广东善安科技 | SRRC认证|CCC认证|CTA申请_IMEI|MAC地址注册-英利检测 | 火锅加盟_四川成都火锅店加盟_中国火锅连锁品牌十强_朝天门火锅【官网】 | 跨境物流_美国卡派_中大件运输_尾程派送_海外仓一件代发 - 广州环至美供应链平台 | nalgene洗瓶,nalgene量筒,nalgene窄口瓶,nalgene放水口大瓶,浙江省nalgene代理-杭州雷琪实验器材有限公司 | YJLV22铝芯铠装电缆-MYPTJ矿用高压橡套电缆-天津市电缆总厂 | ptc_浴霸_大巴_干衣机_呼吸机_毛巾架_电动车加热器-上海帕克 | 水厂自动化|污水处理中控系统|水利信息化|智慧水务|智慧农业-山东德艾自动化科技有限公司 | 电伴热系统施工_仪表电伴热保温箱厂家_沃安电伴热管缆工业技术(济南)有限公司 | 耐高温硅酸铝板-硅酸铝棉保温施工|亿欧建设工程| 雪花制冰机(实验室雪花制冰机)百科 | 浙江清风侠环保设备有限公司| 石家庄装修设计_室内家装设计_别墅装饰装修公司-石家庄金舍装饰官网 | 【化妆品备案】进口化妆品备案流程-深圳美尚美化妆品有限公司 | 广州二手电缆线回收,旧电缆回收,广州铜线回收-广东益福电缆线回收公司 | IHDW_TOSOKU_NEMICON_EHDW系列电子手轮,HC1系列电子手轮-上海莆林电子设备有限公司 | 上海风淋室_上海风淋室厂家_上海风淋室价格_上海伯淋 | 冷藏车-东风吸污车-纯电动环卫车-污水净化车-应急特勤保障车-程力专汽厂家-程力专用汽车股份有限公司销售二十一分公司 | 【电子厂招聘_普工招工网_工厂招聘信息平台】-工立方打工网 | 基业箱_环网柜_配电柜厂家_开关柜厂家_开关断路器-东莞基业电气设备有限公司 | 衡阳耐适防护科技有限公司——威仕盾焊接防护用品官网/焊工手套/焊接防护服/皮革防护手套 | 万烁建筑设计院-建筑设计公司加盟,设计院加盟分公司,市政设计加盟 | 湖南专升本-湖南省专升本报名-湖南统招专升本考试网 | 2025世界机器人大会_IC China_半导体展_集成电路博览会_智能制造展览网 | 校车_校车价格_19座幼儿园校车_幼儿园校车_大鼻子校车 | 小青瓦丨古建筑瓦丨青瓦厂家-宜兴市徽派古典建筑材料有限公司 | 物联网卡_物联网卡购买平台_移动物联网卡办理_移动联通电信流量卡通信模组采购平台? | 超高频感应加热设备_高频感应电源厂家_CCD视觉检测设备_振动盘视觉检测设备_深圳雨滴科技-深圳市雨滴科技有限公司 | 多物理场仿真软件_电磁仿真软件_EDA多物理场仿真软件 - 裕兴木兰 | 哲力实业_专注汽车涂料汽车漆研发生产_汽车漆|修补油漆品牌厂家 长沙一级消防工程公司_智能化弱电_机电安装_亮化工程专业施工承包_湖南公共安全工程有限公司 | 环氧乙烷灭菌器_压力蒸汽灭菌器_低温等离子过氧化氢灭菌器 _低温蒸汽甲醛灭菌器_清洗工作站_医用干燥柜_灭菌耗材-环氧乙烷灭菌器_脉动真空压力蒸汽灭菌器_低温等离子灭菌设备_河南省三强医疗器械有限责任公司 | 三防漆–水性三防漆–水性浸渍漆–贝塔三防漆厂家 | 搪玻璃冷凝器_厂家-越宏化工设备| 运动木地板_体育木地板_篮球馆木地板_舞台木地板-实木运动地板厂家 |