我有一个预处理语句:
PreparedStatement st;
我在代码中尝试使用st.setString方法。
st.setString(1, userName);
userName的值为şakça。setString方法将'shakcha'更改为'?akça',它无法识别UTF-8字符。如何解决这个问题?
谢谢。
我有一个预处理语句:
PreparedStatement st;
我在代码中尝试使用st.setString方法。
st.setString(1, userName);
userName的值为şakça。setString方法将'shakcha'更改为'?akça',它无法识别UTF-8字符。如何解决这个问题?
谢谢。
这个问题可能会出现的方式实际上相当令人印象深刻。如果你正在使用MySQL,可以尝试在JDBC连接URL的末尾添加characterEncoding=UTF-8
参数:
jdbc:mysql://server/database?characterEncoding=UTF-8
您还应该检查表/列的字符集是否为UTF-8。
?
时,这意味着该字符的代码点完全超出了表所配置的字符编码范围。ç
位于 ISO-8859-1 范围内,并且与 UTF-8 中的代码点完全相同( U + 00E7 )。然而,ş
的UTF-8代码点完全超出了ISO-8859-1的范围( U + 015F ,而ISO-8859-1只到U + 00FF)。数据库不会保留该字符并用?
代替它。ç
具有与UTF-8相同的代码点)。Åakça
(ş
由字节0xC5
和0x9F
组成,表示ISO-8859-1中的Å
和a
,而ç
由字节0xC3
和0xA7
组成,代表ISO-8859-1中的Ã
和§
)。setString方法将 'şakça' 改为 '?akça'
您是如何知道setString方法会改变这个内容的?或者您是通过数据库中的内容来判断的?
可能是因为数据库没有配置UTF-8,或者您用于查看数据库内容的工具(如Oracle的SQL*PLUS)无法显示UTF-8。
您可以使用以下查询来在预编译语句中设置Unicode字符串。
PreparedStatement st= conn.prepareStatement("select * from users where username=unistr(?)");// unistr方法适用于Oracle
st.setString(1, userName);