Mysql对字符集的应用分为以下四个方面,今天小编就来聊一聊关于字符串的相关用法说明?接下来我们就一起去研究一下吧!
字符串的相关用法说明
字符集和比较规则的应用Mysql对字符集的应用分为以下四个方面。
Mysql服务器级别用两个系统变量来描述字符集以及比较规则
- 字符集:character_set_server
- 比较规则:collation_server
因为这两个是系统变量自然可以采用如下三种方式修改默认值
- 在默认my.cnf文件中配置。
[server]character_set_server=utf8collation_server=utf8_general_ci### 采用mysqld或者mysqld_safe启动
- 在启动系统服务时采用启动选项配置。#
## 非root用户启动不用带--user=root启动命令[root@test ~]# mysqld --user=root --character_set_server=gbk --collation_server=gbk_bin
- 在客户端采用set形式修改默认值。
#### 修改字符集mysql> set character_set_server=utf8;### 修改比较规则mysql> set collation_server=utf8_general_ci;
数据库级别数据库级别的字符集和比较规则同样由系统变量控制,变量如下
- 字符集:character_set_database
- 比较规则:collation_database
需要注意的是查看时需要先指定是哪个数据库,如果没有指定是哪一个数据库,那么使用的是服务器级别的字符集以及比较规则,演示如下
######################没有指定数据库#########################
### 服务器级别的字符集为gbk,比较规则为gbk_bin
### 数据库级别和服务器级别 字符集,比较规则保持
mysql> show variables like '%character_set_database%';
------------------------ -------
| Variable_name | Value |
------------------------ -------
| character_set_database | gbk |
------------------------ -------
1 row in set (0.00 sec)
mysql> show variables like '%collation_database%';
-------------------- ---------
| Variable_name | Value |
-------------------- ---------
| collation_database | gbk_bin |
-------------------- ---------
1 row in set (0.00 sec)
######################切换test数据库后#######################
mysql> use test;
Database changed
mysql> show variables like '%character_set_database%';
------------------------ -------
| Variable_name | Value |
------------------------ -------
| character_set_database | utf8 |
------------------------ -------
1 row in set (0.00 sec)
mysql> show variables like '%collation_database%';
-------------------- -----------------
| Variable_name | Value |
-------------------- -----------------
| collation_database | utf8_general_ci |
-------------------- -----------------
1 row in set (0.00 sec)
注意如果一个数据库在创建后,将无法通过修改系统参数来修改数据库的字符集以及比较规则,演示如下
### 创建一个数据库默认使用服务器级别的字符集以及比较规则
mysql> create database test01;
Query OK, 1 row affected (0.00 sec)
mysql> use test01;
Database changed
### 查看test01数据库对应的字符集以及比较规则
mysql> select DEFAULT_CHARACTER_SET_NAME,DEFAULT_COLLATION_NAME from information_schema.schemata where schema_name = 'test01';
---------------------------- ------------------------
| DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME |
---------------------------- ------------------------
| gbk | gbk_bin |
---------------------------- ------------------------
1 row in set (0.00 sec)
### 查看数据库级别字符集
mysql> show variables like '%character_set_database%';
------------------------ -------
| Variable_name | Value |
------------------------ -------
| character_set_database | gbk |
------------------------ -------
1 row in set (0.00 sec)
### 设置数据库级别字符集为utf8
mysql> set character_set_database=utf8;
Query OK, 0 rows affected, 1 warning (0.00 sec)
### 查看test01数据库对应的字符集以及比较规则
mysql> select DEFAULT_CHARACTER_SET_NAME,DEFAULT_COLLATION_NAME from information_schema.schemata where schema_name = 'test01';
---------------------------- ------------------------
| DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME |
---------------------------- ------------------------
| gbk | gbk_bin |
---------------------------- ------------------------
1 row in set (0.00 sec)
mysql> show variables like '%character_set_database%';
------------------------ -------
| Variable_name | Value |
------------------------ -------
| character_set_database | utf8 |
------------------------ -------
1 row in set (0.00 sec)
那么数据库的字符集以及比较规则应该如何指定或者修改呢,可以在数据库创建或者修改时指定
### 创建mysql数据库指定utf8字符集,utf8_general_ci比较规则
### 修改语法类似 alter database test02 character set gbk collate gbk_bin;
mysql> create database test02
-> character set utf8
-> collate utf8_general_ci;
### 查看数据库对应的字符集和比较规则
mysql> select * from information_schema.schemata where schema_name='test02';
-------------- ------------- ---------------------------- ------------------------ ----------
| CATALOG_NAME | SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | SQL_PATH |
-------------- ------------- ---------------------------- ------------------------ ----------
| def | test02 | utf8 | utf8_general_ci | NULL |
-------------- ------------- ---------------------------- ------------------------ ----------
1 row in set (0.00 sec)
表级别的字符集和比较规则不由系统参数指定,如果在创建表时没有指定字符集和比较规则那么使用的是数据库的字符集以及比较规则,演示如下
#### 查看数据库test01的字符集和比较规则
mysql> select DEFAULT_CHARACTER_SET_NAME,DEFAULT_COLLATION_NAME from information_schema.schemata where schema_name='test01';
---------------------------- ------------------------
| DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME |
---------------------------- ------------------------
| gbk | gbk_bin |
---------------------------- ------------------------
1 row in set (0.00 sec)
### 创建数据库表,不指定字符集和比较规则
mysql> create table t(
-> col varchar(8)
-> );
Query OK, 0 rows affected (0.00 sec)
### 查看数据库表比较规则和字符集
mysql> show create table t;
------- ------------------------------------------------------------------------------------------------------------------------
| Table | Create Table |
------- ------------------------------------------------------------------------------------------------------------------------
| t | CREATE TABLE `t` (
`col` varchar(8) COLLATE gbk_bin DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=gbk COLLATE=gbk_bin |
------- ------------------------------------------------------------------------------------------------------------------------
1 row in set (0.00 sec)
如果在创建表时指定字符集和编码
mysql> create table t1( col varchar(16) )character set utf8 collate utf8_unicode_ci;
Query OK, 0 rows affected (0.00 sec)
### 查看表的比较规则以及字符集
mysql> show create table t1;
------- -------------------------------------------------------------------------------------------------------------------------------------------
| Table | Create Table |
------- -------------------------------------------------------------------------------------------------------------------------------------------
| t1 | CREATE TABLE `t1` (
`col` varchar(16) COLLATE utf8_unicode_ci DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |
------- -------------------------------------------------------------------------------------------------------------------------------------------
1 row in set (0.00 sec)
列级别的字符集和比较规则同样默认继承自数据表,但也需要注意一个表中可以包含多个列那么不同列可以存在不同的字符集以及比较规则
### 在test01数据库中字符集为gbk,比较规则gbk_bin,在创建t2数据库表时会默认指定为数据库字符集
### 列col1采用数据库字符集和比较规则
### 列col2采用指定的utf8字符集
mysql> create table t2(
-> col1 varchar(8),
-> col2 varchar(16) charset utf8 collate utf8_unicode_ci
-> );
Query OK, 0 rows affected (0.00 sec)
### 查询数据库表t2比较规则
mysql> show create table t2;
------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| Table | Create Table |
------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| t2 | CREATE TABLE `t2` (
`col1` varchar(8) COLLATE gbk_bin DEFAULT NULL,
`col2` varchar(16) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=gbk COLLATE=gbk_bin |
------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 row in set (0.00 sec)
字符集和比较规则是一对多的关系,如果在操作时先改变了字符集那么比较规则会变为默认的比较规则,如果先指定了不同字符集的比较规则,那么字符集也会变为比较规则对应的字符集,验证如下
### 查询服务器级别字符集以及比较规则
mysql> show variables like '%_server%';
--------------------------------- -----------------
| Variable_name | Value |
--------------------------------- -----------------
| character_set_server | gbk |
| collation_server | gbk_bin |
| innodb_ft_server_stopword_table | |
--------------------------------- -----------------
3 rows in set (0.00 sec)
### 修改服务器级别字符集为utf8
mysql> set character_set_server=utf8;
### 查询服务器级别字符集以及比较规则,比较规则变为utf8默认比较规则
mysql> show variables like '%_server%';
--------------------------------- -----------------
| Variable_name | Value |
--------------------------------- -----------------
| character_set_server | utf8 |
| collation_server | utf8_general_ci |
| innodb_ft_server_stopword_table | |
--------------------------------- -----------------
3 rows in set (0.00 sec)
###############上面验证的是字符集,比较规则类似###################