使用准备好的语句,我试图将俄语字符存储在特定表的字段中。表和字段使用 utf8 字符集和 utf8_bin 排序规则。
如果我通过 IDE 或命令行手动运行插入,则字符串会按预期保存。
INSERT INTO utf8Table VALUES('Анатолий Солоницын');
然后我就可以查询该表,也可以取回预期的字符串。
连接是通过 tomcat 的 context.xml 文件中的资源设置的,配置如下:
<Resource
name="jdbc/DoolliDB"
auth="Container"
type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
useUnicode="true"
characterEncoding="UTF8"
....
</Resource>
正如我所说,我能够很好地读取字符串/字符,所以我假设表和连接设置都设置正确。
我通过以下方式使用 PreparedStatement/CallableStatement:
CallableStatement callableStmt = __mySqlConnector.getConnection().prepareCall("INSERT INTO utf8Table VALUES(?)");
callableStmt.setString(1, "Анатолий Солоницын");
callableStmt.executeUpdate();
插入数据库的不是 Анатолий Солоницын,而是:???????? ??????
另请注意,“普通”utf-8 字符串(例如 über)已正确保存。
两个都
System.getProperty("file.encoding")
和
java.nio.charset.Charset.defaultCharset().name()
也都返回 UTF-8。
任何帮助表示赞赏。谢谢