查看: 0|回复: 0

MySQL 5.7.x版本修改字符集(Win11环境)

[复制链接]

2

主题

0

回帖

0

积分

积极分子

金币
0
阅读权限
220
精华
0
威望
0
贡献
0
在线时间
0 小时
注册时间
2011-7-4
发表于 2025-12-29 16:59:00 | 显示全部楼层 |阅读模式

1.前置问题

  • mysql5.7.*版本默认使用的字符集是latin1(拉丁文),当添加中文数据时,出现字符串值不正确。

  • mysql5.7.*版本默认使用latin1,是因为MySQL是由瑞典人开发的,所以默认使用欧洲的字符集。

  • 查看数据表和数据库的默认字符集
    数据表:


    数据库:

  • 查看所有变量的字符集


    其中:
    character_set_client:服务器解码请求时使用的字符集
    character_set_connection: 服务器处理请求时会把请求字符串从character_set_client转character_set_connection
    character_set_database: 当前数据库的字符集
    character_set_server: 服务器级别的字符集

character_set_results: 服务器香客户端返回数据时使用的字符集。其中:服务器级别的字符集和当前数据库的字符集可能不一样。

  • 校对所有字符集

2.修改服务器级别的默认字符集

找到MySQL的数据文件存储目录,找到my.ini文件并打开。
一般数据文件存储目录默认安装在C:\ProgramData\MySQL\MySQL Server 5.7,否则在自定义存储目录查看。

  1. 在文件找到 [mysql] ,在下方添加:
[mysql]
# 默认字符集
default-character-set=utf8
  1. 在文件找到 [mysqld],在下方添加:
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
  1. 最后使用命令重启MySQL服务使配置生效(重启需要管理员权限)
C:\Windows\System32>net stop MySQL57
MySQL57 服务正在停止.
MySQL57 服务已成功停止。


C:\Windows\System32>net start MySQL57
MySQL57 服务正在启动 .
MySQL57 服务已经启动成功。

也可以在windows服务列表中找到MySQL服务进程重启,简单易懂。

  1. 再次查看字符集&系统变量
    查看修改字符集之前创建的数据库和表还是使用之前默认的字符集:


    查看修改字符集之后创建的数据库和表使用的字符集:

    查看修改后系统变量字符集:

  2. 验证插入中文数据

在my.ini中添加默认字符集之前已创建的数据库和数据表如何修改默认字符集?

方式1:直接删除数据库和表,重新创建

# 删除数据表
mysql> delete from table_name;
# 或
mysql> drop table table_name;
# 删除数据库
mysql> drop database db_name;

方式2:数据表级别的默认字符集

# 修改表的默认字符集为utf8
# 语法如下:
# ALTER TABLE 表名(列的信息)
#  [[DEFAULT] CHARACTER SET 字符集名称]
#  [[DEFAULT] COLLATE 比较规则名称]
mysql> alter table table_name convert to character set utf8;
# 或
mysql> alter table table_name charset utf8;

# 查看数据表的默认字符集
mysql> show create table table_name;

方式3:数据库级别的默认字符集

# 修改数据库的默认字符集,同时更改校对
mysql> alter database dbtest1 character set utf8 collate utf8_general_ci;

# 查看数据库的默认字符集
mysql> show create database db_name;

方式4:列级别的默认字符集

# 修改列的字符集(一般不需要)
# 语法如下:
# ALTER TABLE 表名 MODIFY COLUMN 列名 字符串类型 [CHARACTER SET 字符集名称][COLLATE 比较规则名称];
mysql> alter table employees modify column name varchar(10) character set utf8 collate utf8_general_ci;

最佳实践:设定服务器级别的编码是utf8即可,数据库以及数据表保持一致。

3. 字符集和比较规则

3.1 utf8与utf8mb4

UTF-8 是一种变长的字符编码,它是 Unicode 的一种实现方式。在 UTF-8 编码中,每个字符可以使用 1 到 4 字节来表示,但是我们常用的一些字符使用1~3 个字节就可以表示了,UTF-8 编码的最大特点是向后兼容 ASCII,即所有标准的 ASCII 字符(U+0000 到 U+007F)仍然使用 1 字节表示。

UTF-8 能够表示几乎所有的语言字符,并且它已经成为 Web 上最广泛使用的字符编码标准。

1 字节:ASCII 字符(0x00 到 0x7F)
2 字节:较常见的字符,如拉丁字母、汉字等(0x80 到 0x7FF)
3 字节:扩展字符,如一些汉字和其他中等使用频率的字符(0x800 到 0xFFFF)
4 字节:稀有字符,如表情符号、一些少数民族的字符等(0x10000 到 0x10FFFF)

UTF-8MB4 是 UTF-8 的一个增强版,支持完整的 Unicode 字符集,最大支持 4 字节的字符。它可以存储任何 Unicode 字符,包括一些特殊字符,如表情符号、古代文字等。

4 字节:UTF-8MB4 引入了对超过 3 字节字符(例如表情符号和一些少数民族的字符)的支持,这些字符超出了 UTF-8 的支持范围,因此需要使用 4 字节来存储。
在 MySQL 中,UTF-8 实际上并没有完全遵循 Unicode 标准,最多支持 3 字节的字符,而 UTF-8MB4 解决了这个问题,提供了完整的 Unicode 支持。

在 MySQL 中使用 UTF-8 和 UTF-8MB4

虽然字符集表示一个字符所用的最大字节长度,但在某些方面会影响系统的存储和性能,所以MySQL的设计者偷偷定义了两个概念:

  • utf8mb3 : 阉割过的utf8字符集,只使用1~3 个字节表示字符。在MySQL中utf8是utf8mb3的别名,所以之后在MySQL中提到utf8就意味着使用1~3个字节表示一个字符。

  • utf8mb4: 正宗的utf8字符集,使用1~4个字节表示字符。

utf8 的字符集对于很多应用来说已经足够,但随着应用程序和网站逐渐支持表情符号和更多的 Unicode 字符(例如古代文字、特殊符号),utf8 已经不再能满足所有需求。

utf8mb4 完全支持 Unicode 标准,特别是对于现代 Web 应用,支持表情符号和特殊符号的需求越来越高。例如,社交平台、聊天应用、用户评论等都需要能够处理表情符号和其他特殊字符。

因此,如果你的应用中包含用户输入的文本(例如社交网络、即时消息系统等),使用utf8mb4是更加推荐的选择。

所以MySQL官方从MySQL 8.0.28开始使用utf8mb4作为默认字符集,MySQL 从 ‌5.5.3‌ 版本开始引入并支持 utf8mb4 字符集,但MySQL 5.x还是使用latin1作为默认字符集。
查看MySQL支持的所有字符集:

mysql> show charset;

3.2 比较规则

如上图中,MySQL版本一共支持41种字符集,其中的 Default collation 列表示这种字符集中一种默认的比较规则,里面包含着该比较规则主要作用于哪种语言,比如:utf8_polish_ci 表示以波兰语的规则比较, utf8_general_ci 是一种通用的比较规则。后缀表示该比较规则是否区分语言中的重音,大小写,具体如下:

后缀 英文释义 描述
_ai accent insensitive 不区分重音
_as accent sensitive 区分重音
_ci case insensitve 不区分大小写
_cs case sensitive 区分大小写
_bin binary 以二进制方式比较

最后一列Maxlen,它代表该字符集表示一个字符最多需要几个字节。

字符集名称 Maxlen
ascill 1
latin1 1
gb2312 2
gbk 2
utf8 3
utf8mb4 4
#查看gbk字符集的比较规则
SHOW COLLATION LIKE 'gbk%'
#查看utf8字符集的比较规则
SHOW COLLATION LIKE 'utf8%'


来源:https://www.cnblogs.com/lisong0626/p/19416905
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

相关侵权、举报、投诉及建议等,请发 E-mail:qiongdian@foxmail.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部