使用预准备语句我试图将俄语字符存储在特定表的字段中。表和字段使用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。
感谢任何帮助。感谢
答案 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语句,也许他们会在这里提供帮助:
例如:
CallableStatement callableStmt = __mySqlConnector.getConnection().prepareCall("set character_set_results=utf8");