我正在尝试在Java中的MySQL数据库中检索已存储为UTF-8的字符串。
在Python中或通过命令行检索它们会产生正确的编码,并且所有特殊字符都会以它们应该的方式显示。但是,在Java中检索它们之后,大多数特殊字符都会被破坏。
结果如下: RT @okay_password:à¸-à¸μà¹à¹€à¸£à¸²²¹€àààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààà -ษàààààಲ¹ààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààà ‡A'€一个«A'‡一个™AA¢€à¸¹à¹à¸§à¹à¸²à¹à¸,า๓มà¹à¹“A” A'‰à¹à¸“A£à¹Œà¹€ ราààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààà ¸•à¸£à¸‡à¸™àà±à¹‰à¸™à¹à¸à¸‡http://t.co /uIâ€|
或以字节为单位(来自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 5F 70 61 73 73 77 6F 72 64 3A 20 E0 B8 97 E0 B8 B5 E0 B9 88 E0 B9 80 E0 B8 A3 E0 B8 B2 ...
注意与西方字符对应的前19个字节是如何匹配然后分叉的。
此外,实际输出长度为2103字节,而不是1047字节。
我已根据其他帖子的建议设置了useUnicode = true& characterEncoding = UTF8和-Dfile.encoding = utf-8,但它似乎没有任何效果。
我也尝试用Java支持的每个编码解码字符串,但是无法正确解码损坏部分的任何子字符串。
我的智慧结束了;我错过了什么?非常感谢任何帮助。
编辑:
该表创建为
CREATE TABLE IF NOT 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)
这看起来像个问题吗?
EDIT2:
尝试了ALTER命令。现在char集看起来像这样,但字节仍然以相同的方式出现:
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:à¸-à¸μà¹à¹€à¸£à¸²à¹€ààààààààààà£à¸£à¸£à¸... ...
有人能理解这个吗?
答案 0 :(得分:0)
您可能需要添加
useUnicode=yes;characterEncoding=utf8;
到您的MySQL JDBC连接器URL。 e.g:
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;