SQL中的Collation是個什麼鬼?

2021-07-03 07:24:29 字數 2233 閱讀 2099

一、說文解字,學習一下collation的字面意思:排序。 (

二、sql中的collation,描述了如何對查詢出來的資料進行比較和排序,本質是定義了兩個cell的資料進行比較的時候的compare演算法。

三、特別說明幾個sql collation常見詞彙:

1.  ci: case ignore/insensitive,比較的時候不區分大小寫

2. mb4:  multi-bytes-4,4位元組字符集

3. utf8mb4_unicode_ci: utf8mb4表示編碼規則為支援4個位元組字元的utf8,unicode表示採用unicode編碼(unicode編碼將幾乎地球上所有字元都賦予乙個數字編號)。

四、感性例子:a和b的collation都是utf8-general-ci,不區分大小寫,所以where可以查詢出所有符合條件的大寫、小寫字串。

深入一些的思考(這時候就繞不開字符集問題了,如果你要實現乙個資料庫,實現compare演算法,這個必須面對):

一、utf8,unicode,gb2312這些,都是什麼鬼?

地球上有這樣一群猴子,他們覺得必須給全世界亂七八糟的文字編乙個字典,每一頁上寫乙個「字」。這本字典編成後,世界上每個字都有了乙個唯一的頁碼。這個頁碼,就是這個字的uni-code。uni-code,就是uni(統一)-code(編碼)的意思。有unicode的時候,這群猴子還沒發明計算機。所以,unicode和計算機無關。

後來,猴子進化成了人,發明了計算機,他們想在計算機上用unicode。最簡單,最直觀的方式就是把字典頁碼作為乙個數字記錄到計算機裡面,第10356頁,放到計算機裡面就是數字10356(0x2874),這就是ucs-2編碼了。地球上的文字如果少於65536個,那麼用ucs-2可以全部都表示出來。地球上的文字如果多餘65536個呢?那就必須用ucs-4編碼了,4個位元組搞定全世界。特別注意,我用了乙個詞彙:編碼。unicode到ucs-2,是一一相等對映的,即便如此簡單,也是一種編碼過程。

可惜,早期的人類缺乏先見之明,只考慮了ascii碼。並且,他們還發明了unix作業系統,在unix下相當多得工具中,單位元組的0被當做了一種非常特殊的字元:字串終結符。這時候問題就來了,如果採用ucs-2或者ucs-4,這些工具會統統完蛋。

為了解決這個問題,就需要採用一些編碼技術,把字典編號(unicode)對映到乙個不包含0byte的編碼空間中,繞開0這個東西,目標編碼,就是utf8。如下圖:

u-00000000 - u-0000007f:  0******x  

u-00000080 - u-000007ff: 110***xx 10******

u-00000800 - u-0000ffff: 1110***x 10****** 10******

u-00010000 - u-001fffff: 11110*** 10****** 10****** 10******

u-00200000 - u-03ffffff: 111110xx 10****** 10****** 10****** 10******

u-04000000 - u-7fffffff: 1111110x 10****** 10****** 10****** 10****** 10******

左邊是unicode空間,右邊是utf8空間。所以,utf8,只是unicode在計算機裡的一種表示方式而已,它的誕生,源於:1,規避單位元組0內容  2,高效編碼(相對於ucs-2, ucs-4)。

note:

1.ucs代表universal character set通用字符集

2.utf代表ucs transformation format

那麼,什麼是gb2312呢?它是和unicode地位相等的。也就是說,它和utf8、unicode沒有任何關係。他是另一本字典,主要針對中文字元。

二、utf8mb4_unicode_ci又是幾個意思呢?它跟utf8mb4_generic_ci有啥區別?

按理說出現了utf8的地方,就沒必要再出現unicode了,因為utf8肯定是用於表示unicode的。所以,不用糾結了,上面倆東西,就是人造出來的,用來表示某種區別(程式設計做變數命名的人肯定有這種經驗,單詞只是用來表示某種意思的,並不一定精確)。區別是啥呢?generic就是用古板的unicode數字比較,效能高。unicode方式,能處理一些「變體」的比較,例如,在德語和一些其它語言中『ß』等於『ss』。參考這篇文章,講得很好:

C 中與SQL中求本週是本年的第幾周

c 中與sql中求本週是本年的第幾周最近的乙個 周報表 既需要c 求本週是今年的第幾周 又需要在儲存過程裡 通過sql求。在 sql裡 有函式可以直接求出。但是在c 裡 沒有直接的屬性或函式,必須自己來算。c 裡可以知道今天是本週的第幾天,還可以知道今天是本年的第幾天。這樣我們就可以求出本週是今年的...

什麼是SQL注入

本文純屬以個人的角度去看待sql注入,有些地方不足,請各位讀者指點批評 什麼sql注入,為什麼會發生sql注入,sql注入的危害,怎樣預防sql注入 sql注入 注入結構化查詢語言 所謂sql注入,就是通過把sql命令插入到web表單中 此處涉及到sql注入的點 提交最終達到欺騙伺服器執行惡意的sq...

在sql中不指定Order by排序是按照主鍵嗎

在sql中不指定order by,排序是按照主鍵嗎?答案是不一定。舉個例子www.cppcns.com 查詢attendanceemprank表,主鍵是attendanceemployeerankid,而且是聚集索引 執行下面的語句,發現第一句不指定order by的結果跟第二句不一樣。再看看執行計...