在UTF-8 MySQL数据库和BoneCP中插入日语字符串

时间:2012-08-07 17:28:53

标签: java mysql sql encoding utf-8

我在MySQL中使用Java应用程序插入日文字符时遇到问题 如果我插入这个字符串“今日は”,我得到这个“???”。

我的表及其字段使用UTF-8。 我认为不涉及表结构,因为当我从PHP插入相同的字符串时,它可以工作。

CREATE TABLE `pool` (
  `id` int(8) NOT NULL AUTO_INCREMENT, 
  `message` varchar(160) COLLATE utf8_bin NOT NULL DEFAULT ''
  PRIMARY KEY (`id`),
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

我正在使用lib“BoneCPConfig”连接数据库,他为我管理了一个连接池:

Class.forName("com.mysql.jdbc.Driver");

Properties props = new Properties();
props.setProperty("characterEncoding", "UTF-8");
props.setProperty("useUnicode", "true");

BoneCPConfig config = new BoneCPConfig(props);
config.setJdbcUrl("jdbc:mysql://" + MYSQL_HOST_NAME + "/" + MYSQL_BASE_NAME);
config.setMinConnectionsPerPartition(MIN_CONNEXION_PER_PARTITION); 
config.setPartitionCount(PARTITION_COUNT); 
config.setUsername(MYSQL_LOGIN);
config.setPassword(MYSQL_PASSWORD);

我像这样插入:

String query = "INSERT INTO pool (message) VALUES(?) ";

PreparedStatement insertStatement = connection.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
insertStatement.setString(1, "今日は");
insertStatement.execute();

我认为我的问题在于连接配置,但我不知道该怎么做: - / 你知道吗?


编辑:

问题解决了,见下文

1 个答案:

答案 0 :(得分:3)

问题是lib BoneCP谁不使用参数中传递的属性... 我通过替换:

Properties props = new Properties();
props.setProperty("characterEncoding", "UTF-8");
props.setProperty("useUnicode", "true");

BoneCPConfig config = new BoneCPConfig(props);
config.setJdbcUrl("jdbc:mysql://" + MYSQL_HOST_NAME + "/" + MYSQL_BASE_NAME);

with:

BoneCPConfig config = new BoneCPConfig();
config.setJdbcUrl("jdbc:mysql://" + MYSQL_HOST_NAME + "/" + MYSQL_BASE_NAME + "?user=" + MYSQL_LOGIN + "&password=" + MYSQL_PASSWORD + "&characterEncoding=utf-8");