字符集的级别
show variables like ‘%charecter%’;
character_set_server 服务器级别
一般在
5.7: C:\ProgramData\MySQL\MySQL Server 5.7\my.ini
8.0: C:\ProgramData\MySQL\MySQL Server 5.7\my.ini
Linux 系列 vim /etc/my.cnf
character_set_server=xxx # 设定默认字符集
collation_server=xxx_chinese_ci # 对应的默认的比较规则
character_set_database 数据库级别
创建数据库指定
create database xxx
[[default] character set 字符集名称]
[[default] collate 比较规则名称;
修改数据库
alter database xxx
[[default] character set 字符集名称]
[[default] collate 比较规则名称];
create database db_test
character set gb2312
collate gb2312_chinese_ci;create database xxxx # 没有指定,则使用服务器级别的字符集和比较规则
表级别
create table 表名(
列的信息
) engine=InnoDB [[default] character set 字符集名称] [collate 比较规则名称]alter table 表名
[[default] character set 字符集名称]
[collate 比较规则]如果创建和修改表的语句中没有指明字符集和比较规则,将使用该表所在的数据库的字符集和比较规则作为该表的字符集和比较规则
create table t(
col varchar(10)
) character set utf8 collate utf8_general_ci;
列级别
对于存储字符串的列,同一个表中的不同的列也可以有不同的字符集和比较规则。我们在创建和修改列定义的时候可以指定该列的字符集和比较规则,如果不指明,延用表的字符集和比较规则
create table xx(
列名1 字符串类型 [character set 字符集名称] [ collate 比较规则名称],
列名2…
);alter table xx modify 列名 字符串类型 [character set 字符集名称] [ collate 比较规则名称];
character_set_client 服务器解码请求的使用的字符集
character_set_connection 服务器处理请求时会把请求字符串从 character_set_client 转为 charater_set_connection
character_set_results 服务器向客户端返回数据的使用的字符集、
mysql 5.7 默认字符集 latini, 设置 utf8 ,等价于utf8mb3
mysql 8.0 默认字符集 utf8mb4
查看mysql 支持的字符集、和比较规则
show collation like ‘XXX%’;
查看 服务器的字符集和比较规则
查看 数据库的字符集和比较规则
查看数据库的字符集和比较规则
show create database xxx;
修改数据库字符集和比较规则
alter database xxx character set ‘utf8mb4’ collate ‘utf8_general_ci’;
经验
开发中通常把 character_set_client 、character_set_connection、character_set_results 这个三个系统变量【会话系统变量】设置成和客户端使用的字符集要一致。这样减少了很多无谓的字符集转换。
set NAMES 字符集;
等价于
set character_set_client=字符集名称;
set character_set_connection=字符集名称;
set character_set_results=字符集名称;