这是一个带有服务器编码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();
但是在插入/更新时该怎么做?
答案 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和数据库之间的文本编组。