【问题标题】:Java PreparedStatement UTF-8 character problemJava PreparedStatement UTF-8 字符问题
【发布时间】:2011-04-19 05:36:20
【问题描述】:

我有一个准备好的声明:

PreparedStatement st;

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

st.setString(1, userName);

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

谢谢。

【问题讨论】:

  • 您使用的是什么数据库?它是否配置为在该列中接受 Unicode(或您需要的 şakça 的任何内容)?

标签: java database jdbc utf-8 character-encoding


【解决方案1】:

您可以使用如下查询在准备好的语句中设置 unicode 字符串。 PreparedStatement st= conn.prepareStatement("select * from users where username=unistr(?)");// unistr method is for oracle st.setString(1, userName);

【讨论】:

    【解决方案2】:

    这可能被搞砸的方式数量实际上是相当可观的。如果您使用的是 MySQL,请尝试在 JDBC 连接 URL 的末尾添加 characterEncoding=UTF-8 参数:

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

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

    【讨论】:

    • ?characterEncoding=UTF-8 对我不起作用。我试过 ?characterEncoding=utf8 并且它有效。
    • 两者都为我“工作”。对我来说不同的是“utf8”缺少很多符号,而“UTF-8”覆盖了所有符号。
    【解决方案3】:

    每当数据库将字符更改为? 时,这仅意味着相关字符的代码点完全超出了表配置使用的字符编码范围。

    关于问题的原因:ç 位于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 连接编码也配置正确。如果 Java/JDBC 错误地使用了 ISO-8859-1,那么持久化的结果将是 Åakçaş 存在字节 0xC50x9F,它们代表 ISO 中的 Åa -8859-1 和 ç 存在字节 0xC30xA7 代表 ç 在 ISO-8859-1 中)。

    【讨论】:

      【解决方案4】:

      setString 方法将 'şakça' 更改为 '?akça'

      你怎么知道 setString 改变了这个?还是您看到数据库中的内容并做出决定?

      可能是数据库未配置为 UTF-8,或者只是您用来查看数据库内容的工具(SQL*PLUS for Oracle...)无法显示 UTF-8。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-10
        • 1970-01-01
        • 2017-07-30
        • 2011-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-12
        相关资源
        最近更新 更多