MySQL字符集,存储与传输(MySQL 8.0)

以下内容来自对mysql官方文档和google搜索后的整理

查看我们字符相关的mysql系统变量

+--------------------------+---------------------------------------------------------+
| Variable_name            | Value                                                   |
+--------------------------+---------------------------------------------------------+
| character_set_client          | gbk                                                     |
| character_set_connection | gbk                                                     |
| character_set_database    | utf8mb4                                                 |
| character_set_filesystem   | binary                                                  |
| character_set_results        | gbk                                                     |
| character_set_server         | utf8mb4                                                 |
| character_set_system        | utf8                                                    |
| character_sets_dir             | C:\Program Files\MySQL\MySQL Server 8.0\share\charsets\ |
+--------------------------+---------------------------------------------------------+

(不对齐算了)

然后我们要考虑它们分别影响着什么。

 

-----------------------------------------------------------

character_set_server

-----------------------------------------------------------

首先创建数据库时我们用  create database db1;   创建的数据库,其默认字符集,来自character_set_server指定的字符串。

而在某个数据库建表时,默认字符集和默认collate是数据库的默认值。没有在全局变量出现。

官网:https://dev.mysql.com/doc/refman/8.0/en/charset-server.html

假如不使用   create database db1 character set utf8;   之类的指定语句,默认字符集就是第一张图中character_set_server指定的字符集,然后这个character_set_server没有其它用途。

这里有个词,collation,就是指一系列规则,这些规则决定了字符之间如何比较大小,其实这对于中文字符应该没什么用,但是对于英文,至少可以决定a和A是否一个大小,也就是说,是否区分大小写。

官网:https://dataedo.com/kb/databases/mysql/default-databases-schemas

如何改变这个character_set_server呢,在命令行启动mysql服务时添加启动参数(不好,每次都要输一遍),或者修改配置文件(推荐),或者使用在连接服务器后修改(重启服务失效)。

这里有一个问题待考虑,就是多个客户程序与服务器连接,客户端1改变了服务器编码,客户端2是不是会出现问题??

 

 

 

-----------------------------------------------------------

character_set_database

-----------------------------------------------------------

那么character_set_database什么用呢?character_set_database决定了default database的存储字符集。当character_set_database和character_set_server不同,新建的数据库默认为character_set_server的编码。

官网:https://dev.mysql.com/doc/refman/8.0/en/charset-database.html

一个概念default database,就是在刚安装好的mysql输入show databases; 之后展示的数据库。

这些系统自带的数据库,mysql workbench里被隐藏了,default database据参考指其中四个:mysql、Information_schema、performance_schema和sys。

参考:https://dataedo.com/kb/databases/mysql/default-databases-schemas

 

 

 

-----------------------------------------------------------

character_set_client

character_set_connection

character_set_result

-----------------------------------------------------------

服务器和客户端的连接字符集,这个简单但是重要。

character_set_client特指你输入客户端按下回车后,发出的query或者什么命令,以什么方式编码发出。

character_set_connection指服务器收到客户端的,以character_set_client编码输入,在服务器收到后应该被转换成的编码,即将编码从character_set_client转换为character_set_connection。

为什么这么做?stackoverflow:https://stackoverflow.com/questions/16082480/what-is-the-purpose-of-character-set-connection

有人问了,在select "a<b"的时候用,也就是基本跟collate有关系,charset没啥用,但collate基于charset吧。

现在我们知道,有这么一个转换的步骤。

character_set_result:好理解了,server返回内容的编码

官网:https://dev.mysql.com/doc/refman/8.0/en/charset-examples.html

 

 

 

-----------------------------------------------------------

其它

-----------------------------------------------------------

character_set_system:这个值总是utf8,不需要设置,是为存储系统元数据的字符集,来自博客,不一定靠谱。

其它:好理解的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值