文章目录
- 1. 服务器级别
- 2. 数据库级别
- 3. 表级别
- 4. 列级别
MySQL 有 4 个级别的字符集和比较规则,分别是 服务器级别、数据库级别、表级别、列级别.
1. 服务器级别
SHOW VARIABLES like 'character_set_server'
SHOW VARIABLES like 'collation_server'
在启动服务器程序时,可以通过启动选项或者在服务器程序运行过程中使用SET语句来修改这两个变量的值
启动选项:
#当服务器在启动时读取这个配置文件后,这两个系统变量的值便修改了
[server]
character_set_server=gb2312
collation_server=gb2312_chinese_ci
过程中set:
SET character_set_server = gb2312;
2. 数据库级别
我们在创建和修改数据库时可以指定该数据库的字符集和比较规则
具体语法:
CREATE DATABASE 数据库名
[[DEFAULT] CHARACTER SET 字符集名称]
[[DEFAULT] COLLATE 比较规则名称];
ALTER DATABASE 数据库名
[[DEFAULT] CHARACTER SET 字符集名称]
[[DEFAULT] COLLATE 比较规则名称];
如:
CREATE DATABASE task CHARACTER SET gb2312 COLLATE gb2312_chinese_ci;
查看
SHOW VARIABLES like 'character_set_database';
SHOW VARIABLES like 'collation_database';
在数据库的创建语句中也可以不指定字符集和比较规则,如这样
CREATE DATABASE 数据库名;
这将默认使用服务器级别的字符集和比较规则作为数据库的字符集和比较规则·
3. 表级别
我们也可以在创建和修改表的时候指定表的字符集和比较规则
具体语法:
CREATE TABLE 表名(
列的信息
)[[DEFAULT] CHARACTER SET 字符集名称]
[[DEFAULT] COLLATE 比较规则名称];
ALTER TABLE 表名
[[DEFAULT] CHARACTER SET 字符集名称]
[[DEFAULT] COLLATE 比较规则名称];
如:
CREATE TABLE st(
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) DEFAULT NULL,
`entity_type` int(11) DEFAULT NULL,
`entity_id` int(11) DEFAULT NULL,
`target_id` int(11) DEFAULT NULL,
`content` text,
`status` int(11) DEFAULT NULL,
`create_time` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `index_user_id` (`user_id`)
)CHARACTER SET gb2312 COLLATE gb2312_chinese_ci;
如果创建表的语句中没有指明字符集和比较规则 ,则使用该表所在数据库的字符集和比较规则作为该表的字符集和比较规则.
4. 列级别
对于存储字符串的列,同一个表中不同的列也可以有不同的字符集和比较规则。我们在创建和修改列的时候可以指定该列的字符集和比较规则,语法如下:
CREATE TABLE 表名(
列名 字符串类型 [CHARACTER SET 字符集名称] [COLLATE 比较规则名称]
其他列....);
ALTER TABLE 表名 MODIFY 列名 字符串类型 [CHARACTER SET 字符集名称] [COLLATE 比较规则名称];
如:
ALTER TABLE t MODIFY col VARCHAR(10) CHARACTER SET gbk COLLATE gbk_ chinese_ci;
对于某个列来说,如果在创建和修改表的语句中没有指明字符集和比较规则,则使用该列所在表的字符集和比较规则作为其字符集和比较规则。
总结:
由于字符集和比较规则之间相互关联,因此如果只修改字符集,比较规则也会跟着变化;如果只修改比较规则,字符集也会跟着变化.具体规则如下
- 只修改字符集,则比较规则将变为修改后的字符集默认的比较规则,
- 只修改比较规则,则字符集将变为修改后的比较规则对应的字符集.