不能存储在MySQL UTF-8的内容使用Java的PreparedStatement

问题描述 投票:5回答:6

由于一些奇怪的原因,我似乎无法UTF-8的数据添加到我的MySQL数据库。当我进入一个非拉丁字符,它的存储为?????。其他的一切都存储的罚款。因此,例如,“这是一个example®™”保存很好,但“和英辞典”存储为“????”。

连接URL是好的:

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;
}

我使用PreparedStatement的你所期望的,我甚至试过有人提出进入“设置名称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) {
    ...

该表本身似乎要被罚款。

Default Character Set: utf8
Default Collation: utf8_general_ci
...
Field title:
Type text
Character Set: utf8
Collation: utf8_unicode_ci

我测试了它通过一个GUI编辑器输入以Unicode(“和英辞典”特异性),然后从该表中选择 - 和它返回就好了。因此,这似乎是一个JDBC的问题。

我在想什么?

java mysql unicode jdbc utf-8
6个回答
3
投票

有2个MySQL服务器,以便正确地设置UTF-8字符集检查。

数据库级

这是通过创建它获得:

CREATE DATABASE 'db' CHARACTER SET 'utf8';

表级别

所有的表需要在UTF-8还(这似乎是这样的你)

CREATE TABLE  `Table1` (
    [...]
) DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;

最重要的部分是默认字符集= UTF8 COLLATE = utf8_general_ci

最后,如果你的代码不正确处理UTF-8,你可以迫使你的JVM通过在启动时更改设置使用utf8编码:

java -Dfile.encoding=UTF-8 [...]

或改变环境变量

"**JAVA_TOOLS_OPTIONS**" to -Dfile.encoding="UTF-8"

或编程方式通过使用:

System.setProperty("file.encoding" , "UTF-8");

(这最后一个可能没有欲望的效果,因为在JVM上的高速缓存启动时默认的字符编码的值)

希望帮助。


5
投票

在您的JDBC连接字符串,你只需要设置的字符集编码是这样的:

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


3
投票

使用stmt.setNString(...)stmt.setString(...)代替。 另外不要忘记检查列排序规则在数据库方面。


1
投票

如果你登录到你的MySQL数据库和运行show variables like 'character%';这可能会提供一些见解。

既然你得到一个一到一个比多字节字符为问号那么它很可能是连接做字符集转换,并与单字节设置替换字符替换中国汉字。


0
投票

还要检查在Ubuntu Ubuntu默认的工作与en_US环境和没有安装其他的语言环境locale -a命令。同时通过连接JDBC必须指定的characterEncoding = UTF8。


0
投票

添加在你的数据库连接URL的末尾 - (没有别的需要)前。

spring.datasource.url = jdbc:mysql://localhost:3306/dbname?characterEncoding=utf8
© www.soinside.com 2019 - 2024. All rights reserved.