0

当从我的应用程序插入一些中文字符时,它们会以“???”的形式写入数据库。不用说,这一切都可以在内置的命令行 mysql 客户端中正常工作。

连接字符串:

--user-db-uri = jdbc:mysql://localhost/tigasedb?user=tigase_user&password=tigase_passwd&useUnicode=true&characterEncoding=utf8&noAccessToProcedureBodies=true

代码:

try {
            conn_valid_st.setQueryTimeout(query_timeout);
            st = conn.prepareStatement("SET character_set_client = utf8");
            st.execute();
            st.close();
            st = conn.prepareStatement("SET character_set_connection = utf8");
            st.execute();
            st.close();
            st = conn.prepareStatement("SET character_set_results = utf8");
            st.execute();
            st.close();
            st = conn.prepareStatement("SET collation_connection = utf8_general_ci");
            st.execute();
            st.close();
            st = conn.prepareStatement("SET NAMES utf8");
            st.execute();
            st.close();
            st = conn.prepareStatement("SET CHARACTER SET utf8");
            st.execute();
            st.close();
        } catch (SQLException ex) {
            // Ignore for now, it seems that PostgreSQL does not support this method
            // call yet
            if (null != st)
                st.close();

            log.log(Level.WARNING, "DB server said: {0}", ex.toString());
        }

是什么让我难以捉摸?

编辑:

创建表... ENGINE=InnoDB 默认字符集 utf8 collat​​e utf8_unicode_ci ROW_FORMAT=DYNAMIC;

插入字符:在健身房

验证由内置的命令行 mysql 客户端完成。

编辑: http ://docs.oracle.com/cd/E17952_01/refman-5.0-en/connector-j-reference-charsets.html没有帮助

检查系统属性“file.encoding”的值。如果那不是“UTF-8”,那么每当您将字节解码为字符时,都需要明确指定“UTF-8”作为字符编码。例如,当您使用 byte[] 调用 String 构造函数或使用 InputStreamReader 时。

使用 JDBC 连接器 5.1 从 Java 读取/写入 MySQL 中的 UTF-8 数据的问题- 没有帮助

将存储过程中的字符串变量声明为_loc VARCHAR(128) CHARSET utf8- 没有帮助

4

2 回答 2

0

它适用于当前的 5.1.26 驱动程序版本:

createTable("testBugF1", "(`str` varchar(10) ) default character set utf8 collate utf8_unicode_ci ");
String str = "在健身房";

Properties props = new Properties();
props.put("characterEncoding", "utf8");
Connection c = getConnectionWithProps(props);

this.stmt = c.createStatement();
this.stmt.executeUpdate("insert into testBugF1 values (\""+ str +"\")");
this.rs = this.stmt.executeQuery("select * from testBugF1");
assertTrue(this.rs.next());
String res = this.rs.getString(1);
System.out.println(res);
assertEquals(str, res);

你用老司机吗?你如何插入字符?

于 2013-08-02T08:08:02.940 回答
0

您的数据库表列应使用正确的字符集和排序规则创建。您可以在创建或更改表时定义它:

col_name {CHAR | VARCHAR | TEXT} (col_length)
    [CHARACTER SET charset_name]
    [COLLATE collation_name]

这是帮助您了解更多信息的mysql链接:

http://dev.mysql.com/doc/refman/5.0/en/charset-column.html

于 2013-07-31T11:11:29.303 回答