# 关于MYSQL 字符集
字符集:简单的理解就是 所有字符用一种方式 组成一个集合,全世界有很多种字符,所以对于字符来说,你需要一个翻译让机器知道他所对应的字符。
比较规则,也称校对规则: 这个用来定义谁大谁小,用哪种方式来比 (比如1<2 ,a<b 或者A<b),这个很类似C#里面的 compare ,定义一些对象的比较方式。
在MYSQL中字符集是单独出来的一个内容,
在MSSQL中排序规则(包含了字符集以及比较规则,还多了一个是否区分重音的)
在MYSQL中字符集 级别 有,服务器,数据库,表,列,在查询的时候指定转换
在MSSQL中也有服务器,数据库,以及列,在查询的时候指定转换,没有表。
MYSQL 中 服务器级别的设置:
1.ini中配置 character_set_server=charactername设置,
2.也可以在mysqld 启动中设置(试了下一直在报错未编译的字符集),
3.还可以在 status中设 置: SET @@character_set_server=xxx ,校对规则是 collation_server
在MSSQL 中 服务器级别的要修改 比较麻烦。
A.创建数据库时 或者修改数据库时指定相应的字符集或者校对集
CREATE DATABASE db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]
ALTER DATABASE db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]
例如:
CREATE DATABASE db_name
DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
如果只是指定 字符集,没指定校对集的话,那就是默认字符集的默认的那个校对集。
B. 表字符集和校对
每一个表有一个表字符集和一个校对规则,它不能为空。为指定表字符集和校对规则,CREATE TABLE 和ALTER TABLE语句有一个可选的子句:
CREATE TABLE tbl_name (column_list)
[DEFAULT CHARACTER SET charset_name [COLLATE collation_name]]
ALTER TABLE tbl_name
[DEFAULT CHARACTER SET charset_name] [COLLATE collation_name]
如果没有指定相关的都是一层一层找默认值。
C.
列字符集和校对
每一个“字符”列(即,CHAR、VARCHAR或TEXT类型的列)有一个列字符集和一个列 校对规则,它不能为空。列定义语法有一个可选子句来指定列字符集和校对规则:
col_name {CHAR | VARCHAR | TEXT} (col_length)
[CHARACTER SET charset_name [COLLATE collation_name]]
D.当MYSQL 客户端与服务端 交互时 就会出现字符集的转换与设定问题,
主要的是 客户端字符集,连接字符集,服务端字符集,返回结果字符集。
这些都可以通过系统变量来设计:
客户端字符集 character_set_client,
连接字符集 character_set_connetion,
服务端字符集 character_set_server
返回结果字符集 character_set_results
MYSQL帮助文档描述
10.3.6. 连接字符集和校对
一些字符集和校对规则系统变量与客户端和服务器的交互有关。在前面的章节中已经提到过部分内容:
· 服务器字符集和校对规则可以用作character_set_server和collation_server变量的值。
· 默认数据库的字符集和校对规则可以用作character_set_database和collation_database变量的值。
在客户端和服务器的连接处理中也涉及了字符集和校对规则变量。每一个客户端有一个连接相关的字符集和校对规则变量。
考虑什么是一个“连接”:它是连接服务器时所作的事情。客户端发送SQL语句,例如查询,通过连接发送到服务器。服务器通过连接发送响应给客户端,例如结果集。对于客户端连接,这样会导致一些关于连接的字符集和 校对规则的问题,这些问题均能够通过系统变量来解决:
· 当查询离开客户端后,在查询中使用哪种字符集?
服务器使用character_set_client变量作为客户端发送的查询中使用的字符集。
· 服务器接收到查询后应该转换为哪种字符集?
转换时,服务器使用character_set_connection和collation_connection系统变量。它将客户端发送的查询从character_set_client系统变量转换到character_set_connection(除非字符串文字具有象_latin1或_utf8的引介词)。collation_connection对比较文字字符串是重要的。对于列值的字符串比较,它不重要,因为列具有更高的 校对规则优先级。
· 服务器发送结果集或返回错误信息到客户端之前应该转换为哪种字符集?
character_set_results变量指示服务器返回查询结果到客户端使用的字符集。包括结果数据,例如列值和结果元数据(如列名)。
你能够调整这些变量的设置,或可以依赖默认值(这样,你可以跳过本章)。
有两个语句影响连接字符集:
SET NAMES 'charset_name'
SET CHARACTER SET charset_name
SET NAMES显示客户端发送的SQL语句中使用什么字符集。因此,SET NAMES 'cp1251'语句告诉服务器“将来从这个客户端传来的信息采用字符集cp1251”。它还为服务器发送回客户端的结果指定了字符集。(例如,如果你使用一个SELECT语句,它表示列值使用了什么字符集。)
SET NAMES 'x'语句与这三个语句等价:
mysql> SET character_set_client = X;
mysql> SET character_set_results = X;
mysql> SET character_set_connection = X;
将x设置为character_set_connection也就设置了collation_connection是x的默认校对规则。
SET CHARACTER SET语句是类似的,但是为 默认数据库设置连接字符集和校对规则。SET CHARACTER SET x语句与这三个语句等价:
mysql> SET character_set_client = X;
mysql> SET character_set_results = X;
mysql> SET collation_connection = @@collation_database;
当一个客户端连接时,它向服务器发送希望使用的字符集名称。服务器为那个字符集设置character_set_client、character_set_results和 character_set_connection变量。(实际上,服务器为使用该字符集执行一个SET NAMES操作。)
E.声明字符串时指定相应的字符集以及校对集。
一个字符串文字可能有一个可选的字符集引介词和COLLATE子句:
[_charset_name]'string' [COLLATE collation_name]
F.关于字符集一些转换。可以参考 CAST ,CONVERT 的 USING 使用。
G。查询相关字符集的配置信息。
1. SHOW CHARACTER SET -- 返回所有字符集
2. SHOW COLLATION
3. SHOW CREATE DATABASE-- 返回数据库的字符集与校对规则。
4. SHOW CREATE TABLE-- 返回表
5. SHOW COLUMNS -- 返回列。
这些都 可以 LIKE 正则匹配相关数据。
# 查看字符集 系统变量的设计,也可以单独select @@变量名。
mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+---------------------------------------------------------+
| Variable_name | VALUE |
+--------------------------+---------------------------------------------------------+
| character_set_client | gbk |
| character_set_connection | gbk |
| character_set_database | utf8 |
| character_set_filesystem | BINARY |
| character_set_results | gbk |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | C:\Program Files\MySQL\MySQL SERVER 5.7\SHARE\charsets\ |
+--------------------------+---------------------------------------------------------+
8 ROWS IN SET (0.07 sec)
MSSQL 没有这么多设计,但是相关的 数据库排序规则,列排序规则 也有相关的函数查询。声明时指定规则,以及查询指定规则 都是可以的。
但是有一点,不可以随便更改 库,服务器 排序规则(比较麻烦)
大致总结如上。
字符集:简单的理解就是 所有字符用一种方式 组成一个集合,全世界有很多种字符,所以对于字符来说,你需要一个翻译让机器知道他所对应的字符。
比较规则,也称校对规则: 这个用来定义谁大谁小,用哪种方式来比 (比如1<2 ,a<b 或者A<b),这个很类似C#里面的 compare ,定义一些对象的比较方式。
在MYSQL中字符集是单独出来的一个内容,
在MSSQL中排序规则(包含了字符集以及比较规则,还多了一个是否区分重音的)
在MYSQL中字符集 级别 有,服务器,数据库,表,列,在查询的时候指定转换
在MSSQL中也有服务器,数据库,以及列,在查询的时候指定转换,没有表。
MYSQL 中 服务器级别的设置:
1.ini中配置 character_set_server=charactername设置,
2.也可以在mysqld 启动中设置(试了下一直在报错未编译的字符集),
3.还可以在 status中设 置: SET @@character_set_server=xxx ,校对规则是 collation_server
在MSSQL 中 服务器级别的要修改 比较麻烦。
A.创建数据库时 或者修改数据库时指定相应的字符集或者校对集
CREATE DATABASE db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]
ALTER DATABASE db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]
例如:
CREATE DATABASE db_name
DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
如果只是指定 字符集,没指定校对集的话,那就是默认字符集的默认的那个校对集。
B. 表字符集和校对
每一个表有一个表字符集和一个校对规则,它不能为空。为指定表字符集和校对规则,CREATE TABLE 和ALTER TABLE语句有一个可选的子句:
CREATE TABLE tbl_name (column_list)
[DEFAULT CHARACTER SET charset_name [COLLATE collation_name]]
ALTER TABLE tbl_name
[DEFAULT CHARACTER SET charset_name] [COLLATE collation_name]
如果没有指定相关的都是一层一层找默认值。
C.
列字符集和校对
每一个“字符”列(即,CHAR、VARCHAR或TEXT类型的列)有一个列字符集和一个列 校对规则,它不能为空。列定义语法有一个可选子句来指定列字符集和校对规则:
col_name {CHAR | VARCHAR | TEXT} (col_length)
[CHARACTER SET charset_name [COLLATE collation_name]]
D.当MYSQL 客户端与服务端 交互时 就会出现字符集的转换与设定问题,
主要的是 客户端字符集,连接字符集,服务端字符集,返回结果字符集。
这些都可以通过系统变量来设计:
客户端字符集 character_set_client,
连接字符集 character_set_connetion,
服务端字符集 character_set_server
返回结果字符集 character_set_results
MYSQL帮助文档描述
10.3.6. 连接字符集和校对
一些字符集和校对规则系统变量与客户端和服务器的交互有关。在前面的章节中已经提到过部分内容:
· 服务器字符集和校对规则可以用作character_set_server和collation_server变量的值。
· 默认数据库的字符集和校对规则可以用作character_set_database和collation_database变量的值。
在客户端和服务器的连接处理中也涉及了字符集和校对规则变量。每一个客户端有一个连接相关的字符集和校对规则变量。
考虑什么是一个“连接”:它是连接服务器时所作的事情。客户端发送SQL语句,例如查询,通过连接发送到服务器。服务器通过连接发送响应给客户端,例如结果集。对于客户端连接,这样会导致一些关于连接的字符集和 校对规则的问题,这些问题均能够通过系统变量来解决:
· 当查询离开客户端后,在查询中使用哪种字符集?
服务器使用character_set_client变量作为客户端发送的查询中使用的字符集。
· 服务器接收到查询后应该转换为哪种字符集?
转换时,服务器使用character_set_connection和collation_connection系统变量。它将客户端发送的查询从character_set_client系统变量转换到character_set_connection(除非字符串文字具有象_latin1或_utf8的引介词)。collation_connection对比较文字字符串是重要的。对于列值的字符串比较,它不重要,因为列具有更高的 校对规则优先级。
· 服务器发送结果集或返回错误信息到客户端之前应该转换为哪种字符集?
character_set_results变量指示服务器返回查询结果到客户端使用的字符集。包括结果数据,例如列值和结果元数据(如列名)。
你能够调整这些变量的设置,或可以依赖默认值(这样,你可以跳过本章)。
有两个语句影响连接字符集:
SET NAMES 'charset_name'
SET CHARACTER SET charset_name
SET NAMES显示客户端发送的SQL语句中使用什么字符集。因此,SET NAMES 'cp1251'语句告诉服务器“将来从这个客户端传来的信息采用字符集cp1251”。它还为服务器发送回客户端的结果指定了字符集。(例如,如果你使用一个SELECT语句,它表示列值使用了什么字符集。)
SET NAMES 'x'语句与这三个语句等价:
mysql> SET character_set_client = X;
mysql> SET character_set_results = X;
mysql> SET character_set_connection = X;
将x设置为character_set_connection也就设置了collation_connection是x的默认校对规则。
SET CHARACTER SET语句是类似的,但是为 默认数据库设置连接字符集和校对规则。SET CHARACTER SET x语句与这三个语句等价:
mysql> SET character_set_client = X;
mysql> SET character_set_results = X;
mysql> SET collation_connection = @@collation_database;
当一个客户端连接时,它向服务器发送希望使用的字符集名称。服务器为那个字符集设置character_set_client、character_set_results和 character_set_connection变量。(实际上,服务器为使用该字符集执行一个SET NAMES操作。)
E.声明字符串时指定相应的字符集以及校对集。
一个字符串文字可能有一个可选的字符集引介词和COLLATE子句:
[_charset_name]'string' [COLLATE collation_name]
F.关于字符集一些转换。可以参考 CAST ,CONVERT 的 USING 使用。
G。查询相关字符集的配置信息。
1. SHOW CHARACTER SET -- 返回所有字符集
2. SHOW COLLATION
3. SHOW CREATE DATABASE-- 返回数据库的字符集与校对规则。
4. SHOW CREATE TABLE-- 返回表
5. SHOW COLUMNS -- 返回列。
这些都 可以 LIKE 正则匹配相关数据。
# 查看字符集 系统变量的设计,也可以单独select @@变量名。
mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+---------------------------------------------------------+
| Variable_name | VALUE |
+--------------------------+---------------------------------------------------------+
| character_set_client | gbk |
| character_set_connection | gbk |
| character_set_database | utf8 |
| character_set_filesystem | BINARY |
| character_set_results | gbk |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | C:\Program Files\MySQL\MySQL SERVER 5.7\SHARE\charsets\ |
+--------------------------+---------------------------------------------------------+
8 ROWS IN SET (0.07 sec)
MSSQL 没有这么多设计,但是相关的 数据库排序规则,列排序规则 也有相关的函数查询。声明时指定规则,以及查询指定规则 都是可以的。
但是有一点,不可以随便更改 库,服务器 排序规则(比较麻烦)
大致总结如上。