网站静态生成目录 名称 建议,福州关键词排名推广,做这个网站多少钱,网站灰色变量 a 的字符编码是由参数 CHARACTER_SET_CLIENT 决定的#xff0c;假设此时编码为 A#xff0c;也就是变量 a 的编码。2. 写入语句在发送到 MySQL 服务端之前的编码由 CHARACTER_SET_CONNECTION 决定#xff0c;假设此时编码为 B。3. 经过 MySQL 一系列词法#xff0c;语…变量 a 的字符编码是由参数 CHARACTER_SET_CLIENT 决定的假设此时编码为 A也就是变量 a 的编码。2. 写入语句在发送到 MySQL 服务端之前的编码由 CHARACTER_SET_CONNECTION 决定假设此时编码为 B。3. 经过 MySQL 一系列词法语法解析等处理后写入到表 t1表 t1 的编码为 C。那这里编码 A、编码 B、编码 C 如果不兼容写入的数据就直接乱码。二、客户端乱码表数据正常但是客户端展示后出现乱码。这一类场景指的是从 MySQL 表里拿数据出来返回到客户端MySQL 里的数据本身没有问题。客户端发送请求到 MySQL表的编码为 D从 MySQL 拿到记录结果传输到客户端此时记录编码为 E(CHARACTER_SET_RESULTS)。那以上编码 E 和 D 如果不兼容检索出来的数据就看起来乱码了。但是由于数据本身没有被破坏所以换个兼容的编码就可以获取正确的结果。这一类又分为以下三个不同的小类1)字段编码和表一致客户端是不同的编码比如下面例子 表数据的编码是 utf8mb4而 SESSION 1 发起的连接编码为 gbk。那由于编码不兼容检索出来的数据肯定为乱码。2)表编码和客户端的编码一致但是记录之间编码存在不一致的情形比如表编码是 utf8mb4应用端编码也是 utf8mb4但是表里的数据可能一半编码是 utf8mb4另外一半是 gbk。那么此时表的数据也是正常的不过此时采用哪种编码都读不到所有完整的数据。这样数据产生的原因很多比如其中一种可能性就是表编码多次变更而且每次变更不彻底导致(变更不彻底我之前的篇章里有介绍)。举个例子表 t3 的编码之前是 utf8mb4现在是 gbk而且两次编码期间都被写入了正常的数据。3)每个字段的编码不一致导致乱码和第二点一样的场景。不同的是非记录间的编码不统一而是每个字段编码不统一。举个例子表 c1 字段 a1,a2。a1 编码 gbka2 编码是 utf8mb4。那每个字段单独读出来数据是完整的但是所有字段一起读出来数据总会有一部分乱码。三、LATIN1还有一种情形就是以 LATIN1 的编码存储数据估计大家都知道字符集 LATIN1LATIN1 对所有字符都是单字节流处理遇到不能处理的字节流保持原样那么在以上两种存入和检索的过程中都能保证数据一致所以 MySQL 长期以来默认的编码都是 LATIN1。这种情形看起来也没啥不对的点数据也没乱码那为什么还有选用其他的编码呢原因就是对字符存储的字节数不一样比如 emoji 字符 ❤如果用 utf8mb4 存储占用 3 个字节那 varchar(12) 就能存放 12 个字符但是换成 LATIN1只能存 4 个字符。