我试图在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 mydb
。 tweet
(...)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-à¸μà¹à¹€一个£à¸²à¹€à¸à¹‡à ¸šà¹à¸£à¸²...
任何人都可以理解这一点吗?
什么字符集和排序规则是数据库表编码的?您可能已将UTF-8字符存储到Latin-1表中。 – 2014-10-22 05:26:57