插入/更新到sql_ascii编码postgreSQL

时间:2018-04-08 02:59:05

标签: java postgresql jdbc encoding gbk

这是一个带有服务器编码SQL_ASCII的postgreSQL。当我获取数据时,我必须在select中使用函数convert_to(column1, 'SQL_ASCII'),然后在java中使用new String(value1, 'GBK')来获得正确的值。

但是,当我通过insert / update发送数据时,DB中的值总是出错。任何人都可以告诉我如何通过Java发送包括中文或其他字符的SQL?

Apache DBCP配置:

driverClassName=org.postgresql.Driver
url=jdbc:postgresql://127.0.0.1:5432/fxk_db_sql_ascii
username=test
password=test
initialSize=10
maxTotal=10
maxIdle=10
minIdle=5
maxWaitMillis=1000
removeAbandonedOnMaintenance=true
removeAbandonedOnBorrow=true
removeAbandonedTimeout=1
connectionProperties=useUnicode=true;characterEncoding=SQL_ASCII;allowEncodingChanges=true

java中的SQL查询:

    String sql = "select user_id, first_name as first_name, convert_to(first_name, 'sql_ascii') as first_name1, last_name as last_name, convert_to(last_name, 'sql_ascii') as last_name1 from public.tbl_users";
    ResultSet rs = stmt.executeQuery(sql);
    List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
    ResultSetMetaData md = rs.getMetaData();
    int columnCount = md.getColumnCount();
    while (rs.next()) {
        Map<String, Object> rowData = new HashMap<String, Object>();
        for (int i = 1; i <= columnCount; i++) {
            rowData.put(md.getColumnName(i), rs.getObject(i)==null?"":new String(rs.getBytes(i),"GBK"));
        }
        list.add(rowData);
    } 
  rs.close();

但是在插入/更新时该怎么做?

1 个答案:

答案 0 :(得分:0)

避免SQL_ASCII

您应该使用UTF8而不是SQL_ASCII的服务器编码。

文档对此事非常清楚,甚至包括警告不要做你正在做的事情。引用(强调我的):

  

SQL_ASCII设置与其他设置的行为大不相同。当服务器字符集是SQL_ASCII时,服务器根据ASCII标准解释字节值0-127,而字节值128-255作为未解释的字符。当设置为SQL_ASCII时,不会进行编码转换。因此,这个设置并不是使用特定编码的声明,而是对编码的无知宣言。在大多数情况下,如果您使用任何非ASCII数据,使用SQL_ASCII 设置是不明智的,因为PostgreSQL将无法通过转换或验证非ASCII字符来帮助您。

使用UTF8

使用UTF8的编码,即UTF-8。这可以处理包括中文在内的任何语言的字符。

UTF8编码允许Postgres在Postgres 10及更高版本中使用new support International Components for Unicode (ICU)

Java也使用Unicode编码。只需让您的JDBC驱动程序处理Java和数据库之间的文本编组。