2014-10-22 181 views
1

我试图在Java中的MySQL数据库中检索以UTF-8存储的字符串。MySQL Java连接器UTF8编码问题

在Python中或通过命令行检索它们会产生正确的编码,所有特殊字符都会显示它们应有的方式。但是,在Java中检索它们之后,大多数特殊字符都会变形。

结果如下所示: RT @okay_password:à¸-à¸μà¹à¹à¸£à¸²à¹à¸à¹‡à¸šà¹à¸£à¸²à¹à¸ªà¸μภ¢à¹ƒà¸à¸à¹‡à¹,à¸-A©A'€à¸,า๓มà¹à¹“A” A'‰à¸à¸μà¸à¸™A±à¹à¸™à¹à ¸«à¸àààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààà¸ààààààààààààààà “à¹‰à¹à¸”ุà¹à¸£à¸²à¹¸¸•àà¹àà¸àà¸àààà¸ààààààààààààààààààààààààà¸àààà¸àààà¸àààà¸àààà¸àààà¸àààà¸à¸àà A°AA¢à¸¹à¹à¸•一个£一个‡一个™A±A'‰一个™A'€AA‡http://t.co/UIA€|

或以字节为单位(来自resultSet.getBytes): 52 54 20 40 6F 6B 61 79 5F 70 61 73 73 77 6F 72 64 3A 20 C3 A0 C2 B8 E2 80 94 C3 A0 C2 B8 C2 B5 C3 A0 C2 B9 CB。 ..

而正确的结果应该是: RT @okay_password:ที่เราเจ็บเราเสียใจก็โทษเขาไม่ได้อีกนั่นแหละก็เห็นอยู่ว่าเขาไม่ได้แคร์เราแต่เรายังเลือกจะอยู่ตรงนั้นเองhttp://t.co/uI ... (通过命令行从相同的MySQL表中检索到)

或字节: 52 54 20 40 6F 6B 61 79 70 5F 61 73 73 77 6F 72 64 20 3A E0 B8 97 B8 E0 B5 E0 B9 88 E0 80 B9 E0 B8 A3 E0 B8 B2 ...

请注意,与西方字符对应的前19个字节如何匹配,然后发散。

此外,实际输出长度为2103字节,而不是1047应该是。

我已经设置useUnicode = true & characterEncoding = UTF8和-Dfile.encoding = utf-8推荐的一些其他帖子,但它似乎没有任何效果。

我也试过用Java支持的每种编码解码字符串,但无法正确解码任何已损坏部分的子字符串。

我在我的智慧结束;我错过了什么?任何帮助是极大的赞赏。

编辑:

表已创建为 CREATE TABLE IF NOT EXISTS mydbtweet(...)DEFAULT CHARACTER SET = utf8;

MySQL显示:

显示像'char%'这样的变量;

+--------------------------+----------------------------+ 
| Variable_name   | Value      | 
+--------------------------+----------------------------+ 
| character_set_client  | latin1      | 
| character_set_connection | latin1      | 
| character_set_database | latin1      | 
| character_set_filesystem | binary      | 
| character_set_results | latin1      | 
| character_set_server  | latin1      | 
| character_set_system  | utf8      | 
| character_sets_dir  | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+ 
8 rows in set (0.10 sec) 

这看起来像一个问题吗?

编辑2:

尝试了ALTER命令。现在字符集看起来像这样,但字节仍然以相同的方式出现:

 mysql> show variables like 'char%'; 
+--------------------------+----------------------------+ 
| Variable_name   | Value      | 
+--------------------------+----------------------------+ 
| character_set_client  | latin1      | 
| character_set_connection | latin1      | 
| character_set_database | utf8      | 
| character_set_filesystem | binary      | 
| character_set_results | latin1      | 
| character_set_server  | latin1      | 
| character_set_system  | utf8      | 
| character_sets_dir  | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+ 

集合中的8行(0。10秒)

同时我意识到,我可以在Python中重现该问题。如果我运行通过定期MySQL连接的查询,例如:

import MySQLdb 
... 
     conn = MySQLdb.connect(host=MySQL_host , user=MySQL_user, passwd=MySQL_pass, db=MySQL_db__) 
     cursor = conn.cursor() 
     cursor.execute("""select * from tweet where user_id = '426586170' and time = '2014-03-21+15:10:30';""") 
     data = cursor.fetchall() 
print data[0][3] 

结果显示了罚款。在另一方面,如果我使用Oracle的连接器是这样的:

import mysql.connector 
... 
      cursor = cnx.cursor() 

query = ("SELECT * from tweet WHERE user_id = '426586170' and time = '2014-03-21+15:10:30'") 

cursor.execute(query) 

for (tweet_id, user_id, time, text) in cursor: 
    print text 

我再次得到了乱码输出:RT @okay_password:A-à¸μà¹à¹€一个£à¸²à¹€à¸à¹‡à ¸šà¹à¸£à¸²...

任何人都可以理解这一点吗?

+0

什么字符集和排序规则是数据库表编码的?您可能已将UTF-8字符存储到Latin-1表中。 – 2014-10-22 05:26:57

回答

0

你可能需要

useUnicode=yes;characterEncoding=utf8; 

添加到您的MySQL JDBC连接URL。例如:

url = "jdbc:mysql://dbserver/db?useUnicode=yes&characterEncoding=utf8" 

编辑:我误读了你粘贴的服务器变量。你的数据库字符集仍然是latin1。试试

ALTER DATABASE dbname CHARACTER SET utf8 COLLATE utf8_unicode_ci; 
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci; 
+0

我已经试过了。我的代码看起来像这样现在 connect = DriverManager.getConnection(“jdbc:mysql://”+ host +“/” + database +“?” +“useUnicode = true&characterEncoding = UTF8&”+“user =” + user +“&password =”+ password); 不幸的是,它似乎没有任何影响。 – 2014-10-22 06:19:58

+0

@MuratOzgul我错过了你粘贴的数据库字符集。刚刚更新了我的答案。 – mindex 2014-10-22 06:28:07