Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JDBC和MySQL部分使用UTF8_Java_Mysql_Jdbc_Utf 8 - Fatal编程技术网

Java JDBC和MySQL部分使用UTF8

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

我在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 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