gpt4 book ai didi

java - JDBC 和 MySQL 部分使用 UTF8

转载 作者:行者123 更新时间:2023-11-29 03:27:24 25 4
gpt4 key购买 nike

我在 Linux 上使用 MySQL 5.6.27、Java 连接器 5.1.36,但我对某些塞尔维亚语/克罗地亚语/斯洛文尼亚语字符有疑问。

数据库开始于

./bin/mysqld_safe --user=mysql --bind_address=localhost --character-set-server=utf8 &

数据库是用

创建的
-- CREATE USER 'my_test'@'localhost' IDENTIFIED BY 'my_test';
-- CREATE DATABASE my_test DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
-- GRANT ALL PRIVILEGES ON my_test.* TO 'my_test'@'localhost' IDENTIFIED BY 'my_test';
USE my_test;

CREATE TABLE proba
(
content TEXT NOT NULL
) CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';

INSERT INTO proba(content)
VALUES ('markovič marko SURČIN');

INSERT INTO proba(content)
VALUES ('Nikolić Nikola Ćićevac');

INSERT INTO proba(content)
VALUES ('petroviš đura Đeram');

INSERT INTO proba(content)
VALUES ('Milošević Miloš Šabac');

INSERT INTO proba(content)
VALUES ('jovanović žarko Žarkovo');

这个转储被导入到 MySQL 中

/usr/local/mysql-5.6.27/bin/mysql --user=my_test --password < schema.sql

Java 客户端获取数据用

public class Serbian
{
public static void main(String[] args) throws ClassNotFoundException, SQLException
{
Connection conn = null;
try
{
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/my_test?user=my_test&password=my_test&useUnicode=true&characterEncoding=UTF-8&collation=utf8_unicode_ci");

Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT content FROM proba");
while(rs.next())
{
String s = rs.getString("content");
System.out.println(s);
}
rs.close();
}
catch (SQLException exc)
{
exc.printStackTrace();
}
finally
{
conn.close();
}
}
}

结果是

markovič marko SUR??IN
Nikoli?? Nikola ??i??evac
petroviš ??ura Đeram
Miloševi?? Miloš Šabac
jovanovi?? žarko Žarkovo

(问号实际上是编辑报告的无效字符)。换句话说,字母 Č、Ć、ć、đ 是无效的,而 Ž、ž、č、Š、š、Đ 是有效的。 UTF8 部分工作很奇怪。有什么我应该尝试的,或者这似乎是 MySQL/Java 连接器问题?

最佳答案

评论字段太短。还不是“最终”答案。

您的字母 Ç 应该是 hexdump 的地方显示为 c4 3f,这不是有效的 utf-8。

鉴于

for(byte b : "Č".getBytes("UTF-8")) {
System.out.println("-> " + Integer.toHexString(b));
}

结果在

-> ffffffc4
-> ffffff8c

并且 \uc48c 再次正确打印为 Ç。

您可以检查从 getString() 移动到 getNString() 是否改变了结果。

等一下

“c4 3f”应该是您“丢失”的一些字符。十六进制已经被打破。

关于java - JDBC 和 MySQL 部分使用 UTF8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34356903/

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