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

时间:2013-01-29 18:48:02

标签: java mysql jdbc utf-8

使用预准备语句我试图将俄语字符存储在特定表的字段中。表和字段使用utf8字符集和utf8_bin校对。

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

INSERT INTO utf8Table VALUES('Анатолий Солоницын');

然后我可以查询该表并且也可以返回预期的String。

使用以下配置通过tomcat的context.xml文件中的资源设置Connection:

<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。

感谢任何帮助。感谢

2 个答案:

答案 0 :(得分:5)

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

<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发出查询'set names',如   驱动程序不会检测到字符集已更改,并且将会   继续使用初始期间检测到的字符集   连接设置。

答案 1 :(得分: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");