MySQL Java连接器UTF8编码问题

时间:2014-10-22 04:57:29

标签: java mysql unicode encoding utf-8

我正在尝试在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 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)

这看起来像个问题吗?

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:à¸-à¸μà¹à¹€à¸£à¸²à¹€ààààààààààà£à¸£à¸£à¸... ...

有人能理解这个吗?

1 个答案:

答案 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;