目录
1 字符集编码的查看
MySQL中并没有查看数据库、数据表和字段的字符集编码的专门方法,要想查看编码信息需要采用show关键字得到完整的信息,其中包含了字符集信息。
1.1 数据库的查看方法
# 查看 数据库 的字符集
show create database 数据库名
# 例如:
show create database company;
1.2 数据表的查看方法
下列语句查看的是数据表的完整信息,不仅能够看到表的默认字符集,也能看到各个字段的字符集信息。
# 查看 数据表 的字符集编码
show create table 表名
# 例如
show create table dept1;
1.3 所有字段的查看方法
涉及字符集编码的数据类型是char, varchar, text,主要查看这些数据类型的字段。
# 查看 所有字段 的字符集编码
show full columns from 表名
# 例如
show full columns from dept1;
2 字符集编码的指定
MySQL中字符型数据编码的设置包括两个部分:字符集(character)和校对集(collate),一个字符集有多种校对集,如果不指定会采用默认校对集。
2.1 数据库的指定方法
在创建数据库时记得指定默认编码,后面的数据表如果不做特殊的指定,都按这个编码保存数据。
# 创建 数据库 并且指定 默认字符集编码
create database 数据库名 default character set 字符集名 [collate 校对集名]
# 例如
create database school default character set utf8 collate utf8_bin;
再创建一个数据表,并且显示创建信息,观察表及其字段的字符集编码是否与数据库一致。
# 创建一个数据表,有三个涉及字符编码的字段
create table student (stu_id int, stu_name varchar(10), gender char(1), introduction text(50));
# 查看表的创建信息
show create table student;
2.2 数据表的指定方法
数据表的编码不专门指定依照数据库的编码,也可以单独指定该表自己的默认编码,语句如下:
# 创建 数据表 并且指定 数据表的默认编码
create table 表名(字段1 类型1, 字段2 类型2, ...)
default character set = 字符集名 [collate 校对集名]
# 例如
create table course (cou_id int, cou_name varchar(20))
default character set = gbk collate gbk_bin;
show create table course;
# 查看创建信息
show create table course;
可以看到新建表及其字段的编码与数据库是不同的,指定生效。
2.3 字段的指定方法
字段的编码如不做特殊指定会与其所在数据表的默认编码保持一致,也可以单独指定某个字段自己的字符集编码。
# 创建 数据表 并且指定 字段 的字符集编码
create table 表名 (字段名 数据类型 character set 字符集名 [collate 校对集名]);
# 例如,这里将 gender 的编码指定为GBK,采用默认校对集
create table teacher (tea_id int, tea_name varchar(10),
gender char(1) character set gbk,
course varchar(20));
show create table teacher;
这样设置会导致gender(性别)字段只能传入中文字符,不能传入非中文字符。传入如下两行数据:
insert into teacher values(1,'张三','男','语文'); # 新增成功
insert into teacher values(2,'李四', M,'数学'); # 新增失败
第二行的新增语句的报错信息为:Unknown column 'M' in 'field list' ,其原因就在于字符编码错误。
3 字符集编码的修改
3.1 数据库的修改方法
需要注意的是,数据库的默认字符集被修改之后,修改前已有的数据表及其字段的编码维持原状,新建表的字符集编码如不做特殊指定将与数据库的编码保持一致。
# 修改 数据库 的默认字符集
alter database 数据库名 default character set 字符集名 [collate 校对集名]
# 例如
alter database company default character set latin1;
# 查看数据库当前的字符集编码
show create database company;
可以看到,数据库默认字符集编码的修改已经生效,下面再查看修改前就创建的表的编码:
show create table dept1;
可以看到表及其各个字段的编码都没有变。然后我们再新建一个表,观察新表的默认编码:
create table emp1 (emp_id int, emp_name varchar(10));
可以看到新建表的默认编码已经与被修改的数据库的默认编码保持一致了。
3.2 数据表的修改方法
对于数据表的修改,有 default 和 covert to 两种语句,前者仅仅是调整表的默认字符集,不涉及修改前已经添加的字段;后者会连同字段一起被改掉。
3.2.1 仅修改表
# 仅修改 表 的默认字符集
alter 表名 dept1 default character set 字符集名 [collate 校对集名]
# 例如
alter table dept1 default character set gbk collate gbk_bin;
# 再添加一个新字段
alter table dept1 add `level` varchar(5);
# 查看表的创建信息
show table dept1;
可以观察到,新增字段的编码为表的默认编码,修改前就已被创建的字段的编码不变。
3.2.2 同时修改表和字段
# 同时修改 表 和 字段 的默认编码
alter table 表名 convert to character set 字符集名 [collate 校对集名]
# 例如
alter table dept1 convert to character set utf8 collate utf8_bin;
# 查看创建信息
show create table dept1;
修改后,数据表和表中所有字段的字符集编码是一致的,之前是GBK的level字段也变成了UTF8.
3.3 字段的修改
字段的修改语句比较长,修改字段时要重新指定数据类型(即使不变也要写),然后设置字符集编码,语句格式为:
# 修改 字段 的编码
alter table 表名 change 字段名 字段名 数据类型 character set 字符集名 collate 校对集名
# 例如
alter table dept1 change dname dname varchar(14) character set gbk;
# 查看创建信息
show create table dept1;