用java程序在MySQL client.For示例执行的SQL命令期间嘲笑字符集转换:如何使用java代码来模拟mysql charset转换?
mysql> show variables like 'character%';
+--------------------------+---------------------------------------+
| Variable_name | Value |
+--------------------------+---------------------------------------+
| character_set_client | gbk |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | gbk |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /opt/mysql/server-5.6/share/charsets/ |
+--------------------------+---------------------------------------+
mysql> show create table t4\G
*************************** 1. row ***************************
Table: t4
Create Table: CREATE TABLE `t4` (
`data` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
mysql> insert into t4 select '\U+1F600';
mysql> select data,hex(data) from t4;
+------+-----------+
| data | hex(data) |
+------+-----------+
| ?? | 3F3F |
从MySQL文件(https://dev.mysql.com/doc/refman/5.0/en/charset-connection.html),似乎数据首先从我的操作系统的字符集(UTF8)到客户端转换(gbk),然后从gbk(客户端)到latin1(连接)。因此,基于上述理解,我编写了一个java测试程序员来模拟这种看不见的转换。请看下图:
/**
* os utf-8
* character_set_client gbk
* character_set_connection latin1
* field latin1
*
* @throws UnsupportedEncodingException
*/
@Test
public void test_os_utf8_to_client_gbk_to_connection_latin1() throws UnsupportedEncodingException{
String emoji = "";
String receivedStr = new String(emoji.getBytes("utf-8"),"gbk"); //os(utf-8)-->client(gbk)
System.out.println(receivedStr);//馃榾
String convertedStr = new String(receivedStr.getBytes("latin1"),"latin1"); //client(gbk) --> connection(latin1)
System.out.println(convertedStr);//??
printHexString(convertedStr.getBytes("latin1")); //3f 3f
}
上面的代码可以得到相同的结果,实际操作MySQL。 我想知道这个模拟背后的原理是正确的还是恰到好处的?
感谢您的建议!但我不要求一个好的做法。我想知道mysql charset背后的机制。所以我必须在这个过程中设置差异字符集并观察结果来验证我的假设。因为我不是很熟悉C++,现在通过检查mysql源代码来验证它对我来说有点困难。所以我用java代码来模拟这个。其实我只是想知道mysql charset转换的机制,就是这个java代码是否可以表达真正的mysql操作,或者恰好碰巧得到相同的结果 – zhuguowei
我花了好几年的时间学习了“机制”。我所知道的大部分内容都在[我的博客](http://mysql.rjweb.org/doc.php/charcoll)中。这个答案中给你的是一个缩写,专门针对你提到的内容。由于有关于“移动部件”的内容,实验起来相当具有挑战性。 –