概述分享mysql数据库字符编码中的数据存储编码。今天主要介绍数据传输编码的内容。看完大家对mysql数据库字符编码的策略应该就明白了。01.名词解释1.character_set_client:客户端数据解析编码的字符集。2.character_set_connection:连接层字符集。3.character_set_server:服务器内部运行的字符集。4.character_set_results:查询结果字符集。5.character_set_database:当前数据库的字符集。6.character_set_system:系统源数据(字段名等)字符集。注意:1.还有对应上面的以collat??ion_开头的变量,用来描述字符顺序。2、服务端在编码解析的时候,按照前面链接中的编码进行解析,按照各自的字符集进行编码。3、character_set_server是mysql数据库内存的运行字符集。如果在创建数据库时没有指定数据库的字符集,将使用character_set_server的字符集作为默认字符集;如果创建表时没有指定表的字符集,则使用character_set_database的字符集作为默认字符集;当不指定字段的字符集时,默认使用表的字符集。4.设置名称gbk;相当于同时设置character_set_client、character_set_connection和character_set_results这三个字符集。MySQL客户端分为两种:一种是官方用C语言编写的客户端——MySQL命令程序;另一种是普通程序员使用JDBC和其他连接器API编写的客户端。这里用第一个来分析,分windows和linux两个层次。02.Windows客户端MySQL命令程序不等同于Windows和Linux系统中字符编码处理部分。下图是Windows系统客户端字符编码转换逻辑:服务端存在三个字符变量,客户端存在charset_info。当客户端开始连接服务器时,客户端会根据配置参数设置charset_info为指定的编码,同时通知服务器让服务器将三个字符变量设置为相同的编码。Windows客户端数据传输过程:1)客户端从控制台的标准输入中读取一行命令文本,其编码为操作系统编码;2)客户端将命令从系统编码转码为客户端charset_info变量设置的编码;3)客户端向服务器发送命令文本;4)服务端将接收到的文本解码成character_set_client编码,通常与客户端charset_info保持一致;5)服务器将命令文本转换成character_set_connection;6)服务器执行命令,生成结果;7)将结果转码成character_set_results发送给客户端;8)客户端将接收到的结果解码成charset_info码,通常与character_set_results一致;9)客户端将结果转码为操作系统代码,输出到控制台stdout。由于MySQL程序在Windows平台读取控制台时使用的是UnicodeConsoleReadAPI,程序从控制台获取的原始字符串实际上是UTF16编码的,所以这里的“操作系统编码”不是Windows常用的GBK,但应视为UTF16。03.Linux客户端下图为Linux系统下MySQL客户端程序的字符编码转换逻辑:它与Windows版本的区别在于它不会从终端标准输入转换为操作系统强制编码的字符串转换为charset_info编码,输出到终端的charset_info编码结果字符串不会强制转换为操作系统编码。也就是说,此时Linux平台上的MySQL程序会忽略charset_info这个变量。当然,这样一来,Linux客户端的数据传输过程就比Windows客户端少了几步。其实字符集中可能有两个地方出现乱码,character_set_client和character_set_results。如果两个地方的编码和客户端编码不一致,就会出现乱码。数据可能根本无法保存。***老实说,不要随意设置character_set_client的这些值。如果你能把所有东西都保持为utf8,你会没事的。
