亲爱的,我正在编写的 Java 应用程序有一个小问题。
它是一个通过 JDBC 连接到 MySQL 的应用程序。保存记录时,字符保存正确(如果我在JText框中写“Mexico”并将其发送到数据库,则保存为“Mexico”);但是当使用该方法读回它们时ResultSet.getString()
,“特殊”字符(重音和“ñ”)出现错误(“México”被读作“M��xico”)。
我觉得跟字符的“编码”有关,但是具体是什么我不知道,MySQL数据库使用的是编码utf8_spanish_ci
,函数Charset.defaultCharset()
返回UTF-8
。
所以我的具体问题是:如何让从 MySQL 读取的包含特殊字符(正确存储)的字符串在 Java 应用程序中正确显示?
更新(部分修复):
经过更多搜索后,我发现了这个问题及其对我有帮助的答案。具体来说,它说的是,在打开连接时,您必须指定将使用的字符集;就我而言:
DriverManager.getConnection(
"jdbc:mysql://" + host + "/" + dbName
+ "?useUnicode=true&characterEncoding=utf8_spanish_ci",
user, pass);
但是,它只是部分解决了问题:
读取字段数据时VARCHAR
,会正确读取特殊字符。但是,从 fields 读取时JSON
,具有特殊字符的值仍然显示为“奇怪”。
更新(最终):
问题与MySQL 用于保存 JSON 数据的编码有关。下面的答案说明了我修复它的过程。
在稍微解决了这个问题之后,我在 MySQL 用户手册中找到了这个参考:
因此,无论我使用什么字符编码,MySQL 都会自动将 JSON 字符串转换为
utf8mb4
... 这在保存时没什么大不了的,但是在回读时:(我的解决方案(我怀疑它不是最好的)如下:在查询中写入到所需编码的转换。像这样的东西:
通过这种“适合”,可以完美读取数据(使用所有正确的重音字符)。
我想可能有一种更简单的方法来解决这个问题,但到目前为止,这个解决方案对我有用。