gpt4 book ai didi

java - MySQL Java 连接器 UTF8 编码问题

转载 作者:行者123 更新时间:2023-11-30 22:55:38 24 4
gpt4 key购买 nike

我正在尝试检索在 Java 中的 MySQL 数据库中存储为 UTF-8 的字符串。

在 Python 中或通过命令行检索它们会产生正确的编码,并且所有特殊字符都会按预期的方式显示。然而,在用 Java 检索它们之后,大多数特殊字符都被破坏了。

结果是这样的:RT @okay_password: ที่เราเจ็บเราเสียใจà¸à¹‡à¹‚ภ—ษเà¸,าไม ‡à¹€à¸«à¹‡à¸™à¸à¸¢à¸¹à¹ˆà¸§à¹^าเขาไม รา à¸à¸•à¹ˆà¹€à¸£à¸²à¸¢à¸±à¸‡à¹€à¸¥à¸·à¸à¸à¸ˆà¸°à¸à¸¢à¸¹à¹∼ ¸•à¸£à¸‡à¸™à¸±à¹‰à¸™à¹€à¸à¸‡ 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 ...

而正确的结果应该是:转发@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 支持的每种编码解码字符串,但无法正确解码损坏部分的任何子字符串。

我已经无计可施了;我错过了什么?非常感谢任何帮助。

编辑:

该表创建为如果不存在则创建表 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: ทีà¹^เราเà¸ц็บเรา ...

谁能理解这一点?

最佳答案

你可能需要添加

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;

关于java - MySQL Java 连接器 UTF8 编码问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26500574/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com