mysql關(guān)鍵字怎么辦 mysql調(diào)優(yōu)關(guān)鍵字

MySQL 之 COLLATE 關(guān)鍵字

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

目前創(chuàng)新互聯(lián)已為上1000家的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、網(wǎng)站運(yùn)營、企業(yè)網(wǎng)站設(shè)計(jì)、方城網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

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

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

phpmyadmin截圖

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

COLLATE通常是和數(shù)據(jù)編碼(CHARSET)相關(guān)的,一般來說每種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。

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

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

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

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

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

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

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

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

CREATE DATABASE db_name DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

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

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

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

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

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

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

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

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

MYSQL中的COLLATE是什么?

mysql重命名關(guān)鍵字后怎么保存

mysql重命名關(guān)鍵字后要按鍵盤tab鍵上面,數(shù)字1左邊的那個按鍵來保存。所有編程語言都有關(guān)鍵字或保留關(guān)鍵字,原因是這些關(guān)鍵字所有語言的語法結(jié)構(gòu)存在,在進(jìn)行變量命名時盡量避免。

【MySQL】字段名與關(guān)鍵字沖突解決辦法

??首先,不推薦使用MySQL的關(guān)鍵詞來作為字段名,但是有時候的確沒有注意,或者因?yàn)橹熬瓦@么寫了,沒辦法,那怎么辦呢?

??下面就詳細(xì)的說明一下怎樣使用 方法2 來處理。

??上面的測試表是MySQL自動生成的DDL,其實(shí)從上面就可以看出,MySQL的引號內(nèi)是說明絕對的保證大小寫和當(dāng)做普通字符串處理。

??這里使用了maxvalue這個不常用的關(guān)鍵詞作為字段名,一樣違反了通常常規(guī)的命名規(guī)則,MySQL無法很好的識別。

??查詢SQL:

??在navicat中可以正常執(zhí)行,沒有任何問題。

??然后再運(yùn)行insert語句:

??提示下面的錯誤:

??提示錯誤,但是沒有明顯的說明是關(guān)鍵詞不能識別。

??增加引號,使用MySQL的引號“`”,記住不是普通的英文單引號“'”,是傾斜的上撇,不是豎直的上撇。

??鍵盤輸入方式為鍵盤英文字母鍵上面的數(shù)字鍵1最前面的那個波浪線和頓號組成的鍵。也就是ESC下面,TAB鍵上面的按鍵。

??這樣就可以正常運(yùn)行了。

mysql 中怎么查找一個關(guān)鍵字

需要用到的工具:Mysql數(shù)據(jù)庫,Navicate for mysql,步驟如下:

1、首先打開Navicate,連接Mysql數(shù)據(jù)庫,點(diǎn)擊圖中框中的Mysql數(shù)據(jù)庫右鍵即可。

2、Mysql數(shù)據(jù)庫右鍵之后,然后在出現(xiàn)的菜單欄選擇在數(shù)據(jù)庫中查找選項(xiàng)進(jìn)入。

3、點(diǎn)擊在數(shù)據(jù)庫中查找之后,進(jìn)入新的界面,輸入要查找的關(guān)鍵字或詞語。

4、輸入完成之后,然后點(diǎn)擊右側(cè)的查找按鈕即可完成。

5、然后就可以看到查找結(jié)果了,這樣就解決了問題。

網(wǎng)站標(biāo)題:mysql關(guān)鍵字怎么辦 mysql調(diào)優(yōu)關(guān)鍵字
當(dāng)前地址:http://m.kartarina.com/article12/hjgsdc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司靜態(tài)網(wǎng)站、網(wǎng)站維護(hù)、面包屑導(dǎo)航品牌網(wǎng)站建設(shè)網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營
主站蜘蛛池模板: 亚洲中文字幕无码一区二区三区| 精品国产V无码大片在线看| 熟妇人妻无码中文字幕老熟妇| 67194成l人在线观看线路无码| 国产精品无码翘臀在线观看| 亚洲一本大道无码av天堂| 无码人妻精品一区二区三区蜜桃 | 日韩精品中文字幕无码专区 | 色偷偷一区二区无码视频| 久久久精品天堂无码中文字幕| 亚洲日韩激情无码一区| 国产精品无码一区二区在线观 | 亚洲精品无码日韩国产不卡?V| 久久精品成人无码观看56| 亚洲午夜无码AV毛片久久| 亚洲国产成人精品无码区二本 | 无码国产福利av私拍 | 狠狠躁天天躁中文字幕无码| 亚洲av无码一区二区三区人妖| 高潮潮喷奶水飞溅视频无码| 国产精品亚洲一区二区无码| 亚洲精品无码aⅴ中文字幕蜜桃| 久久老子午夜精品无码怎么打| 中文无码喷潮在线播放| 无码人妻一区二区三区在线水卜樱| 在线精品自偷自拍无码中文| 无码免费一区二区三区免费播放| 国产乱子伦精品无码码专区 | 亚洲av无码一区二区三区观看| 国模无码一区二区三区不卡| 成人免费无码视频在线网站| 日韩av无码中文字幕| 久久久亚洲精品无码| a级毛片无码免费真人久久| 亚洲 另类 无码 在线| 国产精品亚洲一区二区无码| 亚洲免费日韩无码系列 | 亚洲国产超清无码专区| 日日摸日日踫夜夜爽无码| 亚洲AV无码一区二区二三区软件| heyzo专区无码综合|