character set即字符集,校对规则是在字符集内用于

作者: www.9159.com  发布:2019-11-05

 

简要说明

character set和collation的是什么?

字符集&&排序规则

字符集和校对规则
字符集是一套符号和编码。校对规则是在字符集内用于比较字符的一套规则。
MySql在collation提供较强的支持,oracel在这方面没查到相应的资料。
不同字符集有不同的校对规则,命名约定:以其相关的字符集名开始,通常包括一个语言名,并且以_ci(大小写不敏感)、_cs(大小写敏感)或_bin(二元)结束
校对规则一般分为两类:
binary collation,二元法,直接比较字符的编码,可以认为是区分大小写的,因为字符集中'A'和'a'的编码显然不同。
字符集_语言名,utf8默认校对规则是utf8_general_ci
mysql字符集和校对规则有4个级别的默认设置:服务器级、数据库级、表级和连接级。
具体来说,我们系统使用的是utf8字符集,如果使用utf8_bin校对规则执行sql查询时区分大小写,使用utf8_general_ci 不区分大小写。不要使用utf8_unicode_ci。
如create database demo CHARACTER SET utf8; 默认校对规则是utf8_general_ci 。

character set即字符集

字符集是针对不同语言的字符编码的集合,比如UTF-8字符集,GBK字符集,GB2312字符集等等,不同的字符集使用不同的规则给字符进行编码
排序规则则是在特定字符集的基础上特定的字符排序方式,排序规则是基于字符集的,是对字符集在排序方式维度上的一个划分。
排序规则是依赖于字符集的,一种字符集可以有多种排序规则,但是一种排序规则只能基于某一种字符集的
比如中文字符集,也即汉字,可以按照“拼音排序”、“按姓氏笔划排序”等等。
而对于英语,就没有“拼音”和“姓氏笔画”,但是可以分为区分大小写、不区分大小写等等
而其他语言下面也有自己特定的排序规则。

Unicode与UTF8
Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储.
UTF8字符集是存储Unicode数据的一种可选方法。mysql同时支持另一种实现ucs2。

我们常看到的UTF-8、GB2312、GB18030都是相互独立的character set。即对Unicode的一套编码。

在SQL Server中,任何一种字符集的数据库,都能存储任何一种语言的字符。
并不是说拉丁(Latin)字符集的数据就存储不了中文,中文(Chinese)字符集的数据库就存储不了蒙古语(只要操作系统本身支持)
sqlserver中,不管哪种字符集(实际上是排序规则)的数据库(或者字段),都是可以使用nvarchar(或者nchar),而nvarchar(或者nchar)是可以存储任意非Unicode字符的
至于排序规则,那是根据不同的字符集所支持的不同的排序规则人为定义的。

详细说明

那么如何理解Unicode与UTF-8、GB2312的区别呢?

 

字符集(charset):是一套符号和编码。
校对规则(collation):是在字符集内用于比较字符的一套规则,比如定义'A'<'B'这样的关系的规则。不同collation可以实现不同的比较规则,如'A'='a'在有的规则中成立,而有的不成立;进而说,就是有的规则区分大小写,而有的无视。
每个字符集有一个或多个校对规则,并且每个校对规则只能属于一个字符集。

打个比方,你眼前有一个苹果,在英文里称之为apple,而在中文里称之为苹果。

SQL Server中的字符集和排序规则
排序规则只不过是指定了存储的数据的排序(比较)规则而已,换句话说就是,排序规则中已经包含了字符集的信息。
因此在sqlserver中 ,不需要关心字符集,只需要关心排序规则,sqlserver中在创建只能指定排序规则(不能直接指定字符集),
如截图,只能指定collation,也就是字符集

binary collation,二元法,直接比较字符的编码,可以认为是区分大小写的,因为字符集中'A'和'a'的编码显然不同。除此以外,还有更加复杂的比较规则,这些规则在简单的二元法之上增加一些额外的规定,比较就更加复杂了。
mysql5.1在字符集和校对规则的使用比其它大多数数据库管理系统超前许多,可以在任何级别进行使用和设置,为了有效地使用这些功能,你需要了解哪些字符集和 校对规则是可用的,怎样改变默认值,以及它们怎样影响字符操作符和字符串函数的行为。

苹果这个实体的概念就是Unicode,而UTF-8,GB2312可以认为就是不同语言对苹果的不同称谓,本质上都是在描述苹果这个物。

www.9159.com 1

校对规则一般有这些特征:

collation即比对方法

 

两个不同的字符集不能有相同的校对规则。
每个字符集有一个默认校对规则。例如,utf8默认校对规则是utf8_general_ci。
存在校对规则命名约定:它们以其相关的字符集名开始,通常包括一个语言名,并且以_ci(大小写不敏感)、_cs(大小写敏感)或_bin(二元)结束

用于指定数据集如何排序,以及字符串的比对规则。

在MySQL中的字符集和排序规则**

确定默认字符集和校对
字符集和校对规则有4个级别的默认设置:服务器级、数据库级、表级和连接级。
数据库字符集和校对
每一个数据库有一个数据库字符集和一个数据库校对规则,它不能够为空。CREATE DATABASE和ALTER DATABASE语句有一个可选的子句来指定数据库字符集和校对规则:
例如:
CREATE DATABASE db_name DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
MySQL这样选择数据库字符集和数据库校对规则:
· 如果指定了CHARACTER SET X和COLLATE Y,那么采用字符集X和校对规则Y。
· 如果指定了CHARACTER SET X而没有指定COLLATE Y,那么采用CHARACTER SET X和CHARACTER SET X的默认校对规则。
· 否则,采用服务器字符集和服务器校对规则。
在SQL语句中使用COLLATE
•使用COLLATE子句,能够为一个比较覆盖任何默认校对规则。COLLATE可以用于多种SQL语句中。
使用WHERE:
select * from pro_product where product_code='ABcdefg' collate utf8_general_ci
Unicode与UTF8
Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储.Unicode码可以采用UCS-2格式直接存储.mysql支持ucs2字符集。
UTF-8就是在互联网上使用最广的一种unicode的实现方式。其他实现方式还包括UTF-16和UTF-32,不过在互联网上基本不用。
UTF8字符集(转换Unicode表示)是存储Unicode数据的一种可选方法。它根据RFC 3629执行。UTF8字符集的思想是不同Unicode字符采用变长字节序列编码:
· 基本拉丁字母、数字和标点符号使用一个字节。
· 大多数的欧洲和中东手写字母适合两个字节序列:扩展的拉丁字母(包括发音符号、长音符号、重音符号、低音符号和其它音符)、西里尔字母、希腊语、亚美尼亚语、希伯来语、阿拉伯语、叙利亚语和其它语言。
· 韩语、中文和日本象形文字使用三个字节序列
摘自:用梦想丈量人生,用奔跑丈量激情

character set与collation的关系

上面说了,排序规则是依赖于字符集的,一种字符集可以有多种排序规则,但是一种排序规则只能基于某一种字符集的。
如下是MySQL中排序规则和字符集的对应关系。

校对集

软件国际化是大势所趋,所以Unicode是国际化最佳的选择。当然为了提高性能,有些情况下还是使用latin1比较好。 

www.9159.com 2

MySQL5.5.8中共有字符集39,校对集195个

MySQL有两个支持Unicode的character set:

MySQL的建库语法比较扯,可以指定字符集和排序规则,
如果指定的排序规则在字符集的下面,则是没有问题的,如果指定的排序规则不在字符集下面,则会报错。

#显示所有的校对集

  • ucs2:使用16bits来表示一个Unicode字符。
  • utf8:使用1~3bytes来表示一个Unicode字符。

www.9159.com ,比如下面这一句,排序规则utf8_bin是属于字符集utf8下面的一种排序规则,这个语句执行是没有问题的
create database test_database2 charset utf8 collate utf8_bin;
再比如下面这一句,排序规则latin1_bin不是属于字符集utf8下面的一种排序规则,这个语句执行是会报错的
create database test_database2 charset utf8 collate latin1_bin;

Show collation

选择哪个character set视情况而定,例如utf8表示latin字符只需要一个字节,所以当用户数据大部分为英文等拉丁字符时,使用utf8比较节省数据库的存储空间。据说SQL Server采用的是ucs2。

www.9159.com 3

#显示所有的字符集

每个character set会对应一定数量的collation。查看方法是在MySQL的Console下输入:

以上是字符集和排序规则在sqlserver和MySQL中的一些基本应用,再说说常用的排序规则的区别

show character set

show collation;

 

所以一个字符集对应多个校对集,即同样的一个字符集有多重排序规则

我们会看到这样的结果:

***_genera_ci & ***_genera_cs & ***_bin 常见排序规则的特点

比如一个utf8的字符集共有22中排序规则

www.9159.com 4

以上是某种字符集下常用的三种排序规则,下面以常见的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字符集默认的校对集为utf8_general_ci

collation名字的规则可以归纳为这两类:

在utf8_genera_ci的情况下A=a,ä=a

通过show collation like ‘utf8_%'

  • <character set>_<language/other>_<ci/cs>
  • <character set>_bin

 www.9159.com 5

即可查看

例如:

 在utf8_bin排序规则下,A<>a,ä<>a

www.9159.com 6

utf8_danish_ci

www.9159.com 7 

注意:

ci是case insensitive的缩写,cs是case sensitive的缩写。即,指定大小写是否敏感。

所以要想区分大小写,有没有特殊需求,就直接使用utf8_bin(实际上***_general_cs在MySQL中本身就不支持,在SQL Server中支持)
以上字符集的特点以及使用情况在SQL Server中表现为类似。

utf8_general_ci  按照普通的字母顺序,而且不区分大小写(比如:a B c D)

utf8_bin是将字符串中的每一个字符用二进制数据存储,区分大小写。

 

utf8_bin   按照二进制排序(比如:A排在a前面,B D a c)

奇怪的是utf8字符集对应的collation居然没有一个是cs的。

以上。

字符集和校对规则 字符集是一套符号和编码。校对规则是在字符集内用于比较字符的一套规则。 MySql在collation提供较强的支持,...

www.9159.com 8

 

那么utf8_general_ci,utf8_unicode_ci,utf8_danish_ci有什么区别?他们各自存在的意义又是什么? 

同一个character set的不同collation的区别在于排序、字符串对比的准确度(相同两个字符在不同国家的语言中的排序规则可能是不同的)以及性能。

例如:

utf8_general_ci在排序的准确度上要逊于utf8_unicode_ci,当然,对于英语用户应该没有什么区别。但性能上(排序以及比对速度)要略优于utf8_unicode_ci.例如前者没有对德语中ß=ss的支持。

而utf8_danish_ci相比utf8_unicode_ci增加了对丹麦语的特殊排序支持。 

补充:

1、当表的character set是latin1时,若字段类型为nvarchar,则字段的字符集自动变为utf8。可见database character set,table character set,field character set可逐级覆盖。

2、在ci的collation下,如何在比对时区分大小写:

mysql> select * from pet;
+----------+-------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+-------+
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
| whistler | Gwen | bird | NULL | 1988-09-25 | NULL |
+----------+-------+---------+------+------------+-------+
2 rows in set (0.00 sec)

mysql> select * from pet where name = 'whistler';
+----------+-------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+-------+
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
| whistler | Gwen | bird | NULL | 1988-09-25 | NULL |
+----------+-------+---------+------+------------+-------+
2 rows in set (0.00 sec)

mysql> select * from pet where binary name = 'whistler';
+----------+-------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+-------+
| whistler | Gwen | bird | NULL | 1988-09-25 | NULL |
+----------+-------+---------+------+------------+-------+
1 row in set (0.00 sec)

mysql> select * from pet where name = binary 'whistler';
+----------+-------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+-------+
| whistler | Gwen | bird | NULL | 1988-09-25 | NULL |
+----------+-------+---------+------+------------+-------+
1 row in set (0.00 sec)

推荐使用

select * from pet where name = binary 'whistler';

这样可以保证当前字段的索引依然有效,而

select * from pet where binary name = 'whistler';

会使索引失效。

 

参考:

(以上内容转自此篇文章)

http://stackoverflow.com/questions/367711/what-is-the-best-collation-to-use-for-MySQL-with-php

http://dev.MySQL.com/doc/refman/5.0/en/charset-Unicode-sets.html

http://dev.MySQL.com/doc/refman/5.1/en/show-collation.html

http://dev.MySQL.com/doc/refman/5.1/en/charset-binary-op.html

 

本文由9159.com发布于www.9159.com,转载请注明出处:character set即字符集,校对规则是在字符集内用于

关键词:

上一篇:没有了
下一篇:没有了