簡體   English   中英

MySQL Java連接器UTF8編碼問題

[英]MySQL Java Connector UTF8 Encoding Issue

我正在嘗試檢索Java中以MySQL數據庫存儲為UTF-8的字符串。

使用Python或通過命令行檢索它們會產生正確的編碼,並且所有特殊字符都會以應有的方式顯示。 但是,在用Java檢索它們之后,大多數特殊字符都被修飾了。

結果看起來像這樣:RT @okay_password:ที่เราà¹àà€à¹‡à¸š¸¹à¸à¸£à¸²à¹à€à¸à¸µà¸¢à¹ƒ¹¸ˆ A'‡à¹,à¸-A©A'€à¸,า๓มà¹à¹“A” 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 EXISTS mydb tweet (...)默認字符集= 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命令。 現在字符集看起來像這樣,但是字節仍然以相同的方式出現:

        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:ที่เราàà€€à¸ˆ‡à¸šà¹€à¸£à¸²...

任何人都可以理解嗎?

您可能需要添加

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM