SQLServer与MySQL中排序规则与字符集相关知识的⼀点总结
字符集&&排序规则
字符集是针对不同语⾔的字符编码的集合,⽐如UTF-8字符集,GBK字符集,GB2312字符集等等,不同的字符集使⽤不同的规则给字符进⾏编码
排序规则则是在特定字符集的基础上特定的字符排序⽅式,排序规则是基于字符集的,是对字符集在排序⽅式维度上的⼀个划分。
排序规则是依赖于字符集的,⼀种字符集可以有多种排序规则,但是⼀种排序规则只能基于某⼀种字符集的
⽐如中⽂字符集,也即汉字,可以按照“拼⾳排序”、“按姓⽒笔划排序”等等。
⽽对于英语,就没有“拼⾳”和“姓⽒笔画”,但是可以分为区分⼤⼩写、不区分⼤⼩写等等
⽽其他语⾔下⾯也有⾃⼰特定的排序规则。
在SQL Server中,任何⼀种字符集的数据库,都能存储任何⼀种语⾔的字符。
并不是说拉丁(Latin)字符集的数据就存储不了中⽂,中⽂(Chinese)字符集的数据库就存储不了蒙古语(只要操作系统本⾝⽀持)sqlserver中,不管哪种字符集(实际上是排序规则)的数据库(或者字段),都是可以使⽤nvarchar(或者nchar),⽽nvarchar(或者nchar)是可以存储任意⾮Unicode字符的
⾄于排序规则,那是根据不同的字符集所⽀持的不同的排序规则⼈为定义的。
SQL Server中的字符集和排序规则
字符串是什么字符的集合
排序规则只不过是指定了存储的数据的排序(⽐较)规则⽽已,换句话说就是,排序规则中已经包含了字符集的信息。
因此在sqlserver中,不需要关⼼字符集,只需要关⼼排序规则,sqlserver中在创建只能指定排序规则(不能直接指定字符集),
如截图,只能指定collation,也就是字符集
在MySQL中的字符集和排序规则
上⾯说了,排序规则是依赖于字符集的,⼀种字符集可以有多种排序规则,但是⼀种排序规则只能基于某⼀种字符集的。
如下是MySQL中排序规则和字符集的对应关系。
MySQL的建库语法⽐较扯,可以指定字符集和排序规则,
如果指定的排序规则在字符集的下⾯,则是没有问题的,如果指定的排序规则不在字符集下⾯,则会报错。
⽐如下⾯这⼀句,排序规则utf8_bin是属于字符集utf8下⾯的⼀种排序规则,这个语句执⾏是没有问题的
create database test_database2 charset utf8 collate utf8_bin;
再⽐如下⾯这⼀句,排序规则latin1_bin不是属于字符集utf8下⾯的⼀种排序规则,这个语句执⾏是会报错的
create database test_database2 charset utf8 collate latin1_bin;
以上是字符集和排序规则在sqlserver和MySQL中的⼀些基本应⽤,再说说常⽤的排序规则的区别
***_genera_ci & ***_genera_cs & ***_bin 常见排序规则的特点
以上是某种字符集下常⽤的三种排序规则,下⾯以常见的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中表现为类似。
以上。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。