Java—使用PreparedStatement在mysql数据库中存储UTF-8字符(特别是俄语字符)

Java—使用PreparedStatement在mysql数据库中存储UTF-8字符(特别是俄语字符),java,mysql,jdbc,utf-8,Java,Mysql,Jdbc,Utf 8,我试图使用一条准备好的语句将俄语字符存储在特定表的字段中。表和字段使用utf8字符集和utf8\u bin排序规则 如果我通过IDE或命令行手动运行insert,字符串将按预期保存 INSERT INTO utf8Table VALUES('Анатолий Солоницын'); 然后,我可以查询该表,并可以返回预期的字符串 通过tomcat的context.xml文件中的资源设置连接,配置如下: <Resource name="jdbc/DoolliDB"

我试图使用一条准备好的语句将俄语字符存储在特定表的字段中。表和字段使用utf8字符集和utf8\u bin排序规则

如果我通过IDE或命令行手动运行insert,字符串将按预期保存

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>
插入到数据库中的内容是:而不是

还要注意的是,“普通”utf-8字符串,例如über,正在被保存 对

两者

也都返回UTF-8


感谢您的帮助。谢谢

我在PHP中使用了3条sql语句,也许它们在这里会有所帮助:

  • 设置字符集结果=utf8
  • 设置字符集连接=utf8
  • set character\u set\u client=utf8
例如:

CallableStatement callableStmt = __mySqlConnector.getConnection().prepareCall("set character_set_results=utf8");

您需要在数据库url中定义连接编码,而不是在属性中

<Resource 
    name="jdbc/DoolliDB"  
        auth="Container"   
        type="javax.sql.DataSource"   
        driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://localhost:3306/dbName?characterEncoding=UTF-8"
        ...
</Resource>

编译源文件时使用的字符编码是什么?好主意-我在ant构建文件的javac部分添加了encoding=“UTF-8”,但仍然不是joy。这些字符是否作为utf8写入源文件?(即,您提供给javac的版本必须与实际写入字节的方式相匹配)。它们实际上并不存储在源文件中。我只是简化了代码来演示这个问题。它实际上是由用户输入的。在整个代码执行过程中(以及查看tomcat的catalina.out日志),我已经完成了各种打印输出,并且可以肯定地确认设置字符串中使用的字符串是适当的АаааааСаСаСаааааааСааааа?您不应该使用
PreparedStatement
吗?尝试设置集合名称“utf8”(根据mysql文档,这里也是这么做的)和相同的结果。非常感谢!我知道这会很简单,但我在这里拉扯头发,想弄清楚那是什么。现在一切正常。再次感谢!
java.nio.charset.Charset.defaultCharset().name() 
CallableStatement callableStmt = __mySqlConnector.getConnection().prepareCall("set character_set_results=utf8");
<Resource 
    name="jdbc/DoolliDB"  
        auth="Container"   
        type="javax.sql.DataSource"   
        driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://localhost:3306/dbName?characterEncoding=UTF-8"
        ...
</Resource>