从SQLException.getMessage()显示日语字符

时间:2014-07-01 05:40:48

标签: java mysql

我有一个简单的类,它显示数据库中包含日文字符的记录。 类文件的字符编码是UTF-8。我还修改了数据库以使用charset UTF-8。

在控制台上显示包含日文字符的记录没有问题。硬编码也没问题。

但是当我尝试输入具有相同userid(表中的主键)的记录作为旧记录之一时。它抛出SQLException,显示重复的条目错误消息。但它显示垃圾字符。喜欢:

Duplicate entry 'ラケシュ12345' for key 1

那究竟是什么问题。为什么记录正确显示但不是SQLException.getMessage();

1 个答案:

答案 0 :(得分:0)

ラケシュ12345

正确?

INSERTing

时可能会发生什么
  • 您对数据有正确的utf8编码,
  • SET NAMES latin1 - 默认或错误,
  • 存储文本的列(或表)已使用CHARACTER SET latin1声明,默认情况下也是如此。

您可以通过执行

验证数据是否已正确存储
SELECT col, HEX(col) ...

如果您获取该字符串,则十六进制将为E383A9E382B1E382B7E383A5EFBC91EFBC92EFBC93EFBC94EFBC95。注意如何有6个十六进制组,在Katakana的情况下开始E383或在#34;全宽数字"开始EFBC

假设该表仍然显示latin1,没有数据丢失,2-step ALTER将修复它。总结:

ALTER TABLE Tbl MODIFY COLUMN col VARBINARY(...) ...;
ALTER TABLE Tbl MODIFY COLUMN col VARCHAR(...) ... CHARACTER SET utf8 ...;

长度足够大而另一个长度足够..." ..."在列上已经有了其他任何东西(非空等)。

(直到最近,我才能清楚地说明这个问题的答案。)