使用 JDBC for MySQL 从 latin1 字段(varchar 或 char)查询中文值无法获取正确值。性格无法改变。以下是测试步骤。是否有可能在这种情况下获得正确的值?我还应该做什么?
1.创建数据库:
CREATE DATABASE TESTDB CHARACTER SET latin1 COLLATE latin1_general_ci;
2.创建表:
CREATE TABLE TB1 (
vname varchar(50) default '',
cname char(50) default ''
) DEFAULT CHARSET=latin1 ;
3.插入数据:
set names latin1;
insert into TB1(vname,cname) values('名字v','名字c');
4.显示字符集:
mysql> show variables like '%set%';
+--------------------------+---------------------------------------------------------+
| Variable_name | Value |
+--------------------------+---------------------------------------------------------+
| auto_increment_offset | 1 |
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | F:\Program Files\MySQL\MySQL Server 5.5\share\charsets\ |
+--------------------------+---------------------------------------------------------+
5.从命令控制台查询时可以得到正确的值:
mysql> select * from tb1;
+-------+-------+
| vname | cname |
+-------+-------+
| 名字v | 名字c |
+-------+-------+
1 row in set (0.00 sec)
6.使用JDBC查询时无法得到正确的值:
jdbc url : jdbc:mysql://192.168.5.74/testdb?characterEncoding=UTF-8
*set names utf8;
select vname,hex(vname),length(vname),char_length(vname) from tb1;
select cname,hex(cname),length(cname),char_length(cname) from tb1;
select vname,cname
,CONVERT(CONVERT(CONVERT(vname USING latin1) USING binary) USING utf8) as c1
,CONVERT(CONVERT(CONVERT(cname USING latin1) USING binary) USING utf8) as c2
from tb1;*
vname hex(vname) length(vname) char_length(vname)
--------------- -------------- ------------- ------------------
??×?v C3FBD7D676 5 5
cname hex(cname) length(cname) char_length(cname)
--------------- -------------- ------------- ------------------
??×?c C3FBD7D663 5 5
vname cname c1 c2
----------------- --------- ------- ------
??×?v ??×?c