无法使用Java PreparedStatement在MySQL中存储UTF-8内容

nos*_*omo 5 java mysql unicode jdbc utf-8

由于某些奇怪的原因,我似乎无法将UTF-8数据添加到我的MySQL数据库中.当我输入一个非拉丁字符时,它存储为?????.其他一切都存储得很好.因此,例如,"这是一个示例®™"存储得很好,但"和中辞典"存储为"????".

连接网址很好:

private DataSource getDB() throws PropertyVetoException {
    ComboPooledDataSource db = new ComboPooledDataSource();
    db.setDriverClass("com.mysql.jdbc.Driver");
    db.setJdbcUrl("jdbc:mysql://domain.com:3306/db?useUnicode=true&characterEncoding=UTF-8");
    db.setUser("...");
    db.setPassword("...");
    return db;
}
Run Code Online (Sandbox Code Playgroud)

我正在按照您的预期使用PreparedStatement,我甚至尝试按照某人的建议输入"set names utf8".

    Connection conn = null;
    PreparedStatement stmt = null;
    ResultSet rs = null;
    try {
        conn = db.getConnection();

        stmt = conn.prepareStatement("set names utf8");
        stmt.execute();
        stmt = conn.prepareStatement("set character set utf8");
        stmt.execute();

                    ... set title...
        stmt = conn.prepareStatement("INSERT INTO Table (title) VALUES (?)");
        stmt.setString(1,title);

        stmt.execute();
    } catch (final SQLException e) {
    ...
Run Code Online (Sandbox Code Playgroud)

表本身似乎很好.

Default Character Set: utf8
Default Collation: utf8_general_ci
...
Field title:
Type text
Character Set: utf8
Collation: utf8_unicode_ci
Run Code Online (Sandbox Code Playgroud)

我通过GUI编辑器输入Unicode(特别是"和中辞典")然后从表中选择来测试它 - 它返回得很好.所以这似乎是JDBC的一个问题.

我错过了什么?

小智 5

在JDBC连接字符串上,您只需要设置charset编码,如下所示:

JDBC:MySQL的://本地主机:3306/DBNAME的characterEncoding = UTF8


Kha*_*one 4

为了正确设置 UTF-8 字符集,mysql 服务器中有 2 个点需要检查。

数据库层

这是通过创建它获得的:

CREATE DATABASE 'db' CHARACTER SET 'utf8';
Run Code Online (Sandbox Code Playgroud)

表层

所有表格也需要采用 UTF-8 格式(您似乎就是这种情况)

CREATE TABLE  `Table1` (
    [...]
) DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
Run Code Online (Sandbox Code Playgroud)

重要的部分是DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci

最后,如果您的代码没有正确处理 utf8,您可以通过在启动时更改设置来强制 JVM 使用 utf8 编码:

java -Dfile.encoding=UTF-8 [...]
Run Code Online (Sandbox Code Playgroud)

或者改变环境变量

"**JAVA_TOOLS_OPTIONS**" to -Dfile.encoding="UTF-8"
Run Code Online (Sandbox Code Playgroud)

或以编程方式使用:

System.setProperty("file.encoding" , "UTF-8");
Run Code Online (Sandbox Code Playgroud)

(最后一个可能不会达到预期的效果,因为 JVM 在启动时缓存默认字符编码的值)

希望有帮助。