Java PreparedStatement UTF-8字符问题

kam*_*aci 9 java database jdbc utf-8 character-encoding

我有一份准备好的声明:

PreparedStatement st;
Run Code Online (Sandbox Code Playgroud)

在我的代码我尝试使用st.setString方法.

st.setString(1, userName);
Run Code Online (Sandbox Code Playgroud)

userName的值是şakça.setString方法将'şakça'更改为'?akça'.它不识别UTF-8字符.我怎么解决这个问题?

谢谢.

Jos*_*ell 38

这种方式可以搞砸的实际数量令人印象深刻.如果您使用的是MySQL,请尝试characterEncoding=UTF-8在JDBC连接URL的末尾添加一个参数:

jdbc:mysql://server/database?characterEncoding=UTF-8

您还应检查表/列字符集是否为UTF-8.

  • ?characterEncoding = UTF-8对我不起作用.我试过吗?characterEncoding = utf8并且它有效. (2认同)

Bal*_*usC 7

每当数据库将字符更改?为时,它只是意味着所讨论的字符的代码点完全超出了表配置使用的字符编码范围.

至于问题的原因:çISO-8859-1范围内,并且具有与UTF-8(U + 00E7)完全相同的代码点.但是,UTF-8代码点?完全在ISO-8859-1的范围之外(U + 015F,而ISO-8859-1仅上升到U + 00FF).数据库不会保留字符并替换它?.

因此,我怀疑您的数据库表仍然配置为使用ISO-8859-1(或其他兼容的ISO-8859编码之一,其中ç的代码点与UTF-8中的代码点相同).

Java/JDBC API在字符编码方面做得非常好(Java一直使用Unicode),并且JDBC DB连接编码也正确配置.如果爪哇/ JDBC将具有正确使用ISO-8859-1,则持久性结果将是Åakça(该?字节的存在0xC50x9F它代表Åa在ISO-8859-1和ç字节的存在0xC30xA7它代表 ç在ISO-8859- 1).