字符集&&排序規則sql
字符集是針對不一樣語言的字符編碼的集合,好比UTF-8字符集,GBK字符集,GB2312字符集等等,不一樣的字符集使用不一樣的規則給字符進行編碼
排序規則則是在特定字符集的基礎上特定的字符排序方式,排序規則是基於字符集的,是對字符集在排序方式維度上的一個劃分。
排序規則是依賴於字符集的,一種字符集能夠有多種排序規則,可是一種排序規則只能基於某一種字符集的
好比中文字符集,也即漢字,能夠按照「拼音排序」、「按姓氏筆劃排序」等等。
而對於英語,就沒有「拼音」和「姓氏筆畫」,可是能夠分爲區分大小寫、不區分大小寫等等
而其餘語言下面也有本身特定的排序規則。數據庫
在SQL Server中,任何一種字符集的數據庫,都能存儲任何一種語言的字符。
並非說拉丁(Latin)字符集的數據就存儲不了中文,中文(Chinese)字符集的數據庫就存儲不了蒙古語(只要操做系統自己支持)
sqlserver中,無論哪一種字符集(其實是排序規則)的數據庫(或者字段),都是可使用nvarchar(或者nchar),而nvarchar(或者nchar)是能夠存儲任意非Unicode字符的
至於排序規則,那是根據不一樣的字符集所支持的不一樣的排序規則人爲定義的。sqlserver
SQL Server中的字符集和排序規則
排序規則只不過是指定了存儲的數據的排序(比較)規則而已,換句話說就是,排序規則中已經包含了字符集的信息。
所以在sqlserver中 ,不須要關心字符集,只須要關心排序規則,sqlserver中在建立只能指定排序規則(不能直接指定字符集),
如截圖,只能指定collation,也就是字符集編碼
在MySQL中的字符集和排序規則操作系統
上面說了,排序規則是依賴於字符集的,一種字符集能夠有多種排序規則,可是一種排序規則只能基於某一種字符集的。
以下是MySQL中排序規則和字符集的對應關係。code
MySQL的建庫語法比較扯,能夠指定字符集和排序規則,
若是指定的排序規則在字符集的下面,則是沒有問題的,若是指定的排序規則不在字符集下面,則會報錯。server
好比下面這一句,排序規則utf8_bin是屬於字符集utf8下面的一種排序規則,這個語句執行是沒有問題的
create database test_database2 charset utf8 collate utf8_bin;
再好比下面這一句,排序規則latin1_bin不是屬於字符集utf8下面的一種排序規則,這個語句執行是會報錯的
create database test_database2 charset utf8 collate latin1_bin;blog
以上是字符集和排序規則在sqlserver和MySQL中的一些基本應用,再說說經常使用的排序規則的區別排序
***_genera_ci & ***_genera_cs & ***_bin 常見排序規則的特色ci
以上是某種字符集下經常使用的三種排序規則,下面以常見的utf8爲例說明
utf8_genera_ci不區分大小寫,ci爲case insensitive的縮寫,即大小寫不敏感,
utf8_general_cs區分大小寫,cs爲case sensitive的縮寫,即大小寫敏感,可是目前MySQL版本中已經不支持相似於***_genera_cs的排序規則,直接使用utf8_bin替代。
utf8_bin將字符串中的每個字符用二進制數據存儲,區分大小寫。
那麼,一樣是區分大小寫,utf8_general_cs和utf8_bin有什麼區別?
cs爲case sensitive的縮寫,即大小寫敏感;bin的意思是二進制,也就是二進制編碼比較。
utf8_general_cs排序規則下,即使是區分了大小寫,可是某些西歐的字符和拉丁字符是不區分的,好比ä=a,可是有時並不須要ä=a,因此纔有utf8_bin
utf8_bin的特色在於使用字符的二進制的編碼進行運算,任何不一樣的二進制編碼都是不一樣的,所以在utf8_bin排序規則下:ä<>a
在utf8_genera_ci的狀況下A=a,ä=a
在utf8_bin排序規則下,A<>a,ä<>a
因此要想區分大小寫,有沒有特殊需求,就直接使用utf8_bin(實際上***_general_cs在MySQL中自己就不支持,在SQL Server中支持)
以上字符集的特色以及使用狀況在SQL Server中表現爲相似。
以上。