【mysql】字符集的相关操作
【摘要】 修改 MySQL字符集 1. 修改步骤 2. 对已有库和表字符集的变更 3. 各级别的字符集 3.1 服务器级别 3.2 数据库级别 3.3 表级别 3.4 列级别 修改 MySQL字符集 1. 修改步骤在MySQL 8.0版本之前,默认字符集为latin1,utf8字符集指向的是utf8mb3。网站开发人员在数据库设计的时候往往会将编码修改为utf8字符集。如果遗忘修改默认的编码,就会出...
修改 MySQL字符集
1. 修改步骤
- 在MySQL 8.0版本之前,默认字符集为
latin1
,utf8
字符集指向的是utf8mb3
。网站开发人员在数据库设计的时候往往会将编码修改为utf8
字符集。如果遗忘修改默认的编码,就会出现乱码的问题。从MySQL 8.0开始,数据库的默认编码将改为utf8mb4
,从而避免上述乱码的问题。 - 操作1:查看默认使用的字符集
show variables like 'character%';
或
show variables like '%char%';
-
MySQL 8.0 中执行:
-
MySQL 5.7 中执行:
MySQL 5.7默认的客户端和服务器都用了latin1
,不支持中文,保存中文会报错。
-
在mysql8.0 当中,直接创建数据库添加数据是没有问题的,因为默认的字符集是
utf8mb4
,但在 mysql5.7 下创建数据库添加数据时,当添加中文字符时就会报错,原因是mysql5.7默认的字符集是latin1
-
所以,在Linux环境中装好 mysql5.7 时,要修改默认的字符集
-
操作2:修改字符集
vim /etc/my.cnf
- 在MySQ5.7或之前的版本中,在文件最后加上中文字符集配置:
character_set_server=utf8
-
在 mysqld 后面添加
-
操作3:重新启动MySQL服务
-
重启mysql服务,使其生效
systemctl restart mysqld.service
-
但是原库、原表的设定不会发生变化,参数修改只对新建的数据库生效。
-
查看更改的字符集
2. 对已有库和表字符集的变更
-
MySQL5.7版本中,以前创建的库,创建的表字符集还是
latin1
-
修改已创建数据库的字符集
alter database dbtest1 character set 'utf8';
- 修改已创建数据表的字符集
alter table t_emp convert to character set 'utf8';
- 注意:但是原有的数据如果是用非’
utf8
'编码的话,数据本身编码不会发生改变。已有数据需要导出或删除,然后重新插入。
3. 各级别的字符集
- MySQL有4个级别的字符集和比较规则,分别是;
- 服务器级别
- 数据库级别
- 表级别
- 列级别
- 查看服务器级别的字符集:
show variables like 'character%';
character_set_server
: 服务器级别的字符集character_set_database
: 当前数据库的字符集character_set_client
: 服务器解码请求时使用的字符集character_set_connection
: 服务器处理请求时会把请求字符串从character_set_client
转为character_set_connection
character_set_results
: 服务器向客户端返回数据时使用的字符集
3.1 服务器级别
character_set_server
:服务器级别的字符集。- 可以在启动服务器程序时通过启动选项或者在服务器程序运行过程中使用
SET
语句修改这两个变量的值。比如可以在配置文件中这样写:
[server]
character_set_server=gbk # 默认字符集
collection_server=gbk_chinese_ci # 对应的默认比较规则
- 当服务器启动的时候读取这个配置文件后这两个系统变量的值便修改了
3.2 数据库级别
character_set_database
: 当前数据库的字符集- 在创建和修改数据库的时候可以指定该数据库的字符集和比较规则,具体语法如下:
CREATE DATABASE 数据库名
[[DEFAULT] CHARACTER SET 字符集名称]
[[DEFAULT] COLLATE 比较规则名称];
ALTER DATABASE 数据库名
[[DEFAULT] CHARACTER SET 字符集名称]
[[DEFAULT] COLLATE 比较规则名称];
- 其中的
DEFAULT
可以省略,并环影响语句的语义。比如: .
mysql> CREATE DATABASE charset_demo_db
-> CHARACTER SET gb2312
-> COLLATE gb2312_chinese_ci;
Query 0K,1 row affected (0.01 sec)
- 数据库的创建语句中也可以不指定字符集和比较规则,比如这样:
CREATE DATABASE 数据库名;
- 这样的话将使用服务器级别的字符集和比较规则作为数据库的字符集和比较规则。
3.3 表级别
- 也可以在创建和修改表的时候指定表的字符集和比较规则,语法如下:
CREATE DATABASE 表名 (列的信息)
[[DEFAULT] CHARACTER SET 字符集名称]
[[DEFAULT] COLLATE 比较规则名称];
ALTER DATABASE 表名
[[DEFAULT] CHARACTER SET 字符集名称]
[[DEFAULT] COLLATE 比较规则名称];
- 比如在刚刚创建的
charset_demo_ db
数据库中创建一个名为t
的表,并指定这个表的字符集和比较规则:
mysql> CREATE TABLE t(
-> col VARCHAR(10)
-> ) CHARACTER SET utf8 COLLATE utf8_ general_ci;
Query 0K,0 rows affected (0.03 sec)
- 如果创建和修改表的语句中没有指明字符集和比较规则,将使用该表所在数据库的字符集和比较规则作为该表的字符集和比较规则。
3.4 列级别
- 对于存储字符串的列,同一个表中的不同的列也可以有不同的字符集和比较规则。在创建和修改列定义的时候可以指定该列的字符集和比较规则,语法如下:
CREATE TABLE 表名(
列名 字符串类型[CHARACTER SET 字符集名称] [COLLATE 比较规则名称],
其他列...
);
ALTER TABLE 表名 MODIFY 列名 字符串类型[CHARACTER SET 字符集名称] [COLLATE 比较规则名称];
- 比如修改表
t
中列col
的字符集和比较规则可以这样写:
mysql> ALTER TABLE t MODIFY col VARCHAR(10) CHARACTER SET gbk COLLATE gbk_chinese_ci;
Query 0K,0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)