<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      【轉(zhuǎn)】MYSQL中的COLLATE是什么?

      引用于:http://www.rzrgm.cn/qcloud1001/p/10033364.html

      在mysql中執(zhí)行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關(guān)鍵字。這個(gè)值后面對(duì)應(yīng)的utf8_unicode_ci是什么意思呢?面試的時(shí)候用這個(gè)題目考一考DBA,應(yīng)該可以難倒一大部分人。

      COLLATE是用來做什么的?

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

      imgphpmyadmin截圖

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

      各種COLLATE的區(qū)別

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

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

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

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

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

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

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

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

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

      COLLATE設(shè)置級(jí)別及其優(yōu)先級(jí)

      設(shè)置COLLATE可以在示例級(jí)別、庫級(jí)別、表級(jí)別、列級(jí)別、以及SQL指定。實(shí)例級(jí)別的COLLATE設(shè)置就是mysql配置文件或啟動(dòng)指令中的collation_connection系統(tǒng)變量。

      庫級(jí)別設(shè)置COLLATE的語句如下:

      CREATE DATABASE <db_name> DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
      

      如果庫級(jí)別沒有設(shè)置CHARSETCOLLATE,則庫級(jí)別默認(rèn)的CHARSETCOLLATE使用實(shí)例級(jí)別的設(shè)置。在mysql8.0以下版本中,你如果什么都不修改,默認(rèn)的CHARSETLatin1,默認(rèn)的COLLATElatin1_swedish_ci。從mysql8.0開始,默認(rèn)的CHARSET已經(jīng)改為了utf8mb4,默認(rèn)的COLLATE改為了utf8mb4_0900_ai_ci

      表級(jí)別的COLLATE設(shè)置,則是在CREATE TABLE的時(shí)候加上相關(guān)設(shè)置語句,例如:

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

      如果表級(jí)別沒有設(shè)置CHARSETCOLLATE,則表級(jí)別會(huì)繼承庫級(jí)別的CHARSETCOLLATE

      列級(jí)別的設(shè)置,則在CREATE TABLE中聲明列的時(shí)候指定,例如

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

      如果列級(jí)別沒有設(shè)置CHARSETCOLATE,則列級(jí)別會(huì)繼承表級(jí)別的CHARSETCOLLATE

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

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

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

      以上就是關(guān)于mysql的COLLATE相關(guān)知識(shí)。不過,在系統(tǒng)設(shè)計(jì)中,我們還是要盡量避免讓系統(tǒng)嚴(yán)重依賴中文字段的排序結(jié)果,在mysql的查詢中也應(yīng)該盡量避免使用中文做查詢條件。

      此文已由作者授權(quán)騰訊云+社區(qū)發(fā)布,更多原文請(qǐng)點(diǎn)擊

      搜索關(guān)注公眾號(hào)「云加社區(qū)」,第一時(shí)間獲取技術(shù)干貨,關(guān)注后回復(fù)1024 送你一份技術(shù)課程大禮包!

      posted @ 2021-01-20 23:22  gudi  閱讀(305)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 精品少妇爆乳无码aⅴ区| 日韩精品中文字幕有码| 澳门永久av免费网站| 无码日韩做暖暖大全免费不卡| 欧美高清狂热视频60一70| 亚洲国产码专区在线观看| 中日韩精品视频一区二区三区| 国产毛片三区二区一区| 精品 无码 国产观看| 国产av仑乱内谢| 激情综合色五月六月婷婷| 国产极品丝尤物在线观看| 99久久er热在这里只有精品99| 国产午夜福利精品视频| 亚洲国产精品线观看不卡| 天天看片视频免费观看| 国产地址二永久伊甸园| 成人天堂资源www在线| 国产亚洲精品一区二区不卡| 男女裸交免费无遮挡全过程| 一本久道久久综合中文字幕 | 亚洲男人天堂2021| 国产午夜A理论毛片| 国产一区二区不卡视频在线| 久久人妻公开中文字幕| 女子spa高潮呻吟抽搐| 人妻少妇精品性色av蜜桃| 国产精品美女一区二三区| 欧美人禽杂交狂配| 国产一区二区三区不卡自拍 | 福利一区二区1000| 中文字幕精品亚洲二区| 毛片无码免费无码播放| 国产一区二区三区不卡观| AV在线亚洲欧洲日产一区二区| 中文 在线 日韩 亚洲 欧美| 久热这里只有精品在线观看| 久久99精品久久久久久齐齐| 啦啦啦视频在线日韩精品| 黄色免费在线网址| 四虎精品寂寞少妇在线观看|