乱码分析:
首先在cmd窗口下,一个cmd窗口就是一个客户端,默认是使用gbk编码的,但是这个编码是不可以更改的。
当输入汉字"张"的时候客户端使用gbk进行编码:假设 张:1110
服务器使用什么解码的?我们使用show variables like "character%";打印结果如下:
解释:
-----+
| Variable_name | Value
|
+--------------------------+------
-----+
| character_set_client | utf8 服务器认为客户机是使用utf-8进行编码的
|
| character_set_connection | utf8 服务器认为客户机和服务器的连接是utf-8编码
|
| character_set_database | utf8
|
| character_set_filesystem | binar
|
| character_set_results | utf8 服务器认为打印到命令行窗口使用的是utf-8编码
|
| character_set_server | utf8
|
| character_set_system | utf8
虽然服务器是这么认为的但是服务器认为的是错的,因此我需要让服务器知道客户机的编码是gbk
使用set names gbk;
然后查看show variables like "character%";
这样子服务器就会使用gbk进行解码,然后服务器的编码是character_set_database |
utf8
gbk----------------->utf-8会乱码么?
其实底层是这样的,当服务器使用gbk解码后,即String s=new String (1110,gbk),然后编码 s.getBytes(utf-8)存放到数据库中的。
当我们取数据的时候呢是这个过程的逆向过程,转化为gbk的编码发送,因此客户机不会看到乱码。
原理图: