-1

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

但是,当我通过插入/更新发送数据时,数据库中的值总是出错。任何人都可以告诉我如何通过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();

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

4

1 回答 1

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 及更高版本中使用对Unicode 国际组件 (ICU)的新支持。

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

于 2018-04-08T03:28:05.867 回答