【读取流程】
略去前面的sql语句处理流程,从数据读取开始
1. 服务器从存储(例如磁盘)读取数据 =====> 存储不会导致编码转换,因此从存储读取也不需要
2. 服务器判断当前连接返回结果的字符集(character_set_results),
将读取的数据转换为结果集要求的数据 =====> 逆向的第一次转换,对应正向的第二次编码转换
3. 服务器将数据发送给客户端 =====> 传输不会导致编码转换
4. 客户端收到服务器的数据,根据客户端的字符集(character_set_client)进行编码转换 =====> 逆向第二次转换,对应正向第一次编码转换
5. 客户端显示数据 =====> 你能看到乱码的时候
有了这个流程,我们就很容易定位乱码可能产生的地方,以及产生乱码的字符集配置究竟是哪个了。
理想的情况是整个流程中,所有涉及字符转换的地方都不需要转换,这样就不会产生乱码了。
有了上面的理论分析后,我们再结合一个乱码的抓包实例,加深理解,其中有一些问题,请大家思考一下,看看是否真的理解了。
环境:
+--------------------------+-----------------------------------------------------+
| Variable_name | Value |
+--------------------------+-----------------------------------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |










