彻底解决MySQL中的乱码问题( 二 )

  • 当我们使用Windows操作系统时此时会调用操作系统提供的 GetConsoleCP 函数来获取操作系统当前正在使用的字符集 。在Windows里,会把当前cmd.exe使用的字符集映射到一个数字,称之为代码页(英文名: code page ),我们可以通过右键点击 cmd.exe 标题栏,然后点击属性->选项,如下图所示,当前代码页 的值是936,代表当前cmd.exe使用gbk字符集:更简便一点,我们可以运行 chcp 命令直接看到当前code page是什么:这样我们在黑框框里启动MySQL客户端时,MySQL客户端就会检测到这个操作系统使用的是 gbk 字符集,并将客户端默认字符集设置为 gbk。我们前边提到的utf8字符集对应的代码页为 65001,如果当前代码页的值为65001,之后再启动MySQL客户端,那么客户端的默认字符集就会变成 utf8。
  • 如果MySQL不支持自动检测到的操作系统当前正在使用的字符集,或者在某些情况下不允许自动检测的话,MySQL会使用它自己的内建的默认字符集作为客户端默认字符集 。这个内建的默认字符集在 MySQL 5.7 以及之前的版本中是 latin1,在 MySQL 8.0 中修改为了 utf8mb4。
  • 使用了 default-character-set 启动参数如果我们在启动MySQL客户端是使用了 default-character-set 启动参数,那么客户端的默认字符集将不再检测操作系统当前正在使用的字符集,而是直接使用启动参数 default-character-set 所指定的值 。比方说我们使用如下命令来启动客户端:mysql --default-character-set=utf8 那么不论我们使用什么操作系统,操作系统目前使用的字符集是什么,我们都将会以utf8作为MySQL客户端的默认字符集 。
  • 在确认了MySQL客户端默认字符集之后,客户端就会向服务器发起登陆请求,传输一些诸如用户名、密码等信息,在这个请求里就会包含客户端使用的默认字符集是什么的信息,服务器收到后就明白了稍后客户端即将发送过来的请求是采用什么字符集编码的,自己生成的响应应该以什么字符集编码了(剧透一下:其实服务器在明白了客户端使用的默认字符集之后,就会将 character_set_client 、 character_set_connection 以及 character_set_result 这几个系统变量均设置为该值) 。
    客户端发送请求登陆成功之后,我们就可以使用键盘在黑框框中键入我们想要输入的MySQL语句,输入完了之后就可以点击回车键将该语句当作请求发送到服务器,可是客户端发送的语句(本质是个字符串)到底是采用什么字符集编码的呢?这其实涉及到应用程序和操作系统之间的交互,我们的MySQL客户端程序其实是一个应用程序,它从黑框框中读取数据其实是要调用操作系统提供的读取接口 。在不同的操作系统中,调用的读取接口其实是不同的,我们还得分情况讨论一下: