Java JDBC和MySQL部分使用UTF8
我在Linux上使用的是MySQL 5.6.27和Java Connector 5.1.36,我对一些塞尔维亚/克罗地亚/斯洛文尼亚字符有问题 数据库是以Java JDBC和MySQL部分使用UTF8,java,mysql,jdbc,utf-8,Java,Mysql,Jdbc,Utf 8,我在Linux上使用的是MySQL 5.6.27和Java Connector 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 DAT
./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
结果是
markovič marko SUR??IN
Nikoli?? Nikola ??i??evac
petroviš ??ura Đeram
Miloševi?? Miloš Šabac
jovanovi?? žarko Žarkovo
(问号实际上是编辑器报告的无效字符)。换句话说,字母Ć、Ć、ć、đ无效,而字母Ž、ž、č、š、Đ有效。奇怪的是UTF8部分工作。我是否应该尝试一下,或者这似乎是MySQL/Java连接器的问题?注释字段太短。还没有一个“最终”答案 您的字母Č应该在哪里显示为c4 3f,这是无效的utf-8 鉴于
for(byte b : "Č".getBytes("UTF-8")) {
System.out.println("-> " + Integer.toHexString(b));
}
导致
-> ffffffc4
-> ffffff8c
并且\uc48c
再次正确打印为Č
您可以检查从getString()
移动到getNString()
是否会更改结果
等一下
到处都是“C43F”,你的一些“缺失”字符应该是。十六进制已经损坏。这是解决方案。SQL文件保持不变,尽管添加了
SET NAMES 'utf8' COLLATE 'utf8_general_ci';
不痛。导入转储必须通过添加开关--默认字符集=utf8
来更改:
/usr/local/mysql-5.6.27/bin/mysql --user=my_test --password --default-character-set=utf8 < schema.sql
执行程序并重定向到文件(java-cp.:./mysql-connector-java-5.1.36-bin.jar“Serbian>java.log
)不会产生问题,因此一切看起来都很好:
markovič marko SURČIN
Nikolić Nikola Ćićevac
petroviš đura Đeram
Milošević Miloš Šabac
jovanović žarko Žarkovo
@Jan,@GordThompson:感谢您帮助我们更好地理解这个问题。这是控制台输出,但您可以尝试将其写入一个文件吗?实际上,它写入了一个文件,而不是控制台。Hmmm-您在一个字符的位置有两个问号-这感觉像Editor试图显示ISO-*代码。您可以对该文件进行十六进制解码,或者使用不同的编辑器(您现在使用的是什么?)确保数据库、文件和控制台正确执行编码。现在我不相信你知道它在哪里丢失了。你的信显示为C43F,它是쐿 在utf-8中。在你找回那根绳子之前,一定有东西坏了。您是如何获得字节的?我也尝试了
getNString()
并以同样的方式工作。如果十六进制已经损坏,那么连接器或MySQL端就有问题了?它可能仍然是文件/系统的输出。尝试写入从数据库中读取的字符串字节。在MySQL中,您可以看到它们应该是什么样的名称?我想您必须这样做:逐层。检查mysql中的字节。查看在getString()中接收到的字节,依此类推。您尝试过从java插入字符串吗?我看您可能混淆了UTF-8编码和Unicode代码点C43F
实际上不是有效的UTF-8编码,因为第二个字节以位00
开始,而不是10
开始。而Č
确实是UTF-8编码为C48C
,但这与Unicode码点\uC48C
不同,后者是쒌代码>和UTF-8编码为EC 92 8C
。
System.out.println(new String(rs.getString("content").getBytes(Charset.forName("UTF-8"))));
markovič marko SURČIN
Nikolić Nikola Ćićevac
petroviš đura Đeram
Milošević Miloš Šabac
jovanović žarko Žarkovo