mysql jdbc驱动程序无法识别latin1字符

时间:2016-08-02 19:58:38

标签: java mysql jdbc

这是我目前的字符集。我试图插入latin1字符,我无法让它工作。

SHOW VARIABLES LIKE 'char%';
+--------------------------+-----------------------------------+
| Variable_name            | Value                             |
+--------------------------+-----------------------------------+
| character_set_client     | latin1                            |
| character_set_connection | latin1                            |
| character_set_database   | utf8                              |
| character_set_filesystem | binary                            |
| character_set_results    | latin1                            |
| character_set_server     | latin1                            |
| character_set_system     | utf8                              |
| character_sets_dir       | /space/xyz/mysql/share/charsets/ |
+--------------------------+-----------------------------------+

数据库配置不是由我创建的,所以我无法更改字符集或整理。

show create table t1;
+-------+-------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                            |
+-------+-------------------------------------------------------------------------------------------------------------------------+
| t1    | CREATE TABLE `t1` (
  `col1` text CHARACTER SET latin1
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs |
+-------+-------------------------------------------------------------------------------------------------------------------------+

以下是使用unicode字符插入名称的简单代码。

private void insert() {
        try {
            loadJdbcProperties();
            String myquery = "INSERT INTO db.t1(col1) VALUES (?)";
            String url = "jdbc:mysql://localhost:3307/db?useUnicode=true&characterEncoding=Cp1252";
            Properties prop = new Properties();
            prop.put("user", "root");
            prop.put("password", "root");
            if (_jdbcProperties != null && !_jdbcProperties.isEmpty()) {
                prop.putAll(_jdbcProperties);
            }
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            Connection c = DriverManager.getConnection(url, prop);

            PreparedStatement pstmt = null;
            String sql = null;

            sql = myquery;
            pstmt = c.prepareStatement(sql);
            pstmt.setString(1, "csvźà.py");
            pstmt.execute();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

这是检索的代码。

    private void showResults() {
        try {
            loadJdbcProperties();
            String myquery = "select col1 from db.t1";
            String url = "jdbc:mysql://localhost:3307/db?useUnicode=true&characterEncoding=Cp1252";

            Properties prop = new Properties();
            prop.put("user", "root");
            prop.put("password", "root");
            if (_jdbcProperties != null && !_jdbcProperties.isEmpty()) {
                prop.putAll(_jdbcProperties);
            }
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            Connection c = DriverManager.getConnection(url, prop);

            PreparedStatement pstmt = null;
            String sql = null;
            ResultSet rs = null;

            sql = myquery;
            pstmt = c.prepareStatement(sql);
            rs = pstmt.executeQuery();
            while (rs.next()) {
                System.out.println(rs.getString("col1"));

            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

结果如下:

csv?à.py

1 个答案:

答案 0 :(得分:0)

ź字符(Unicode代码点U+017A)未包含在latin1字符集中,因此MySQL无法将其存储在latin1列中。 (对于记录,它也不在Windows-1252字符集中。)

如果您确实需要在该列中存储该字符,则需要

  • 将列的字符集更改为utf8
  • 以自己的方式手动编码和解码字符串,以便将其存储为latin1字符(例如,csv\u017aà.py

并相应调整您的代码。