7

使用准备好的语句,我试图将俄语字符存储在特定表的字段中。表和字段使用 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。

任何帮助表示赞赏。谢谢

4

2 回答 2

7

您需要在数据库 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>

请参阅http://dev.mysql.com/doc/refman/4.1/en/connector-j-reference-charsets.html

警告 不要使用 Connector/J 发出查询“集名称”,因为驱动程序不会检测到字符集已更改,并将继续使用在初始连接设置期间检测到的字符集。

于 2013-01-30T12:09:39.343 回答
0

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

  • 设置 character_set_results=utf8
  • 设置 character_set_connection=utf8
  • 设置 character_set_client=utf8

例如:

CallableStatement callableStmt = __mySqlConnector.getConnection().prepareCall("set character_set_results=utf8");
于 2013-01-29T18:54:24.123 回答