如何将特殊字符保存到字符串?

时间:2015-07-29 16:04:32

标签: java mysql string utf-8

我做了aplication,我必须在mysql中保存用户 但是当用户在mysql中有这样的名字“Michał”(带有波兰字符)时,他就像这样保存“Micha?”怎么改变这个?在mysql中,我已经加入了utf-8。

这是我的代码:

public void save() {
    Connection conn = Main.getMySQL().getConnection();
    if (conn == null) {
        try {
            conn = Main.getMySQL().openConnection();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    PreparedStatement st = null;
    StringBuilder query = new StringBuilder();
    query.append("INSERT INTO `HelperTime` (`uid`, `name`,`time`,`idletime`) ")
            .append("VALUES (?,?,?,?) ON DUPLICATE KEY UPDATE ")
            .append(" `uid`=VALUES(`uid`), `name`=VALUES(`name`), `time`=VALUES(`time`), ")
            .append("`idletime`=VALUES(`idletime`)");
    try {
        st = conn.prepareStatement(query.toString());
        st.setString(1, uid);
        st.setString(2, name);
        st.setLong(3, time);
        st.setLong(4, idleTime);
        st.executeUpdate();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    Main.getMySQL().closeResources(null, st);
}

1 个答案:

答案 0 :(得分:1)

问号来自:

  • 客户端有一个有效字符(好)和
  • SET NAMES同意客户端的编码(好),但
  • 目标列CHARACTER SET不包含预期字符(错误)。

示例:

  • latin1仅处理西欧角色;试 将东欧角色或任何亚洲角色放入 它不会适合。
  • latin2cp1250可以处理捷克语,因此它们之间的转换大多数都可以, 但不在它们之间和latin1
  • 之间
  • utf8mb4utf8的超集。 将utf8字符放入utf8mb4是可以的,但相反 会产生一个'?'在某些情况下。

转换为'?'的字符无法从表中恢复。

如何修复未来INSERTs

  • 在表格列上使用utf8mb4可能适用于所有情况。
  • 否则,为与客户数据合理匹配的表列选择一些CHARACTER SET

编码:

HEX('Michał') is '4D69636861C582'  'C582' is utf8 for 'ł'

底线:更改表格的CHARACTER SET