Java 插入/更新sql\U ascii编码postgreSQL
这是一个postgreSQL,服务器编码为SQL\U ASCII。当我获取数据时,我必须在select中使用函数Java 插入/更新sql\U ascii编码postgreSQL,java,postgresql,jdbc,encoding,gbk,Java,Postgresql,Jdbc,Encoding,Gbk,这是一个postgreSQL,服务器编码为SQL\U ASCII。当我获取数据时,我必须在select中使用函数convert\u to(column1,'SQL\u ASCII'),然后在java中使用newstring(value1,'GBK')来获取正确的值 但是,当我通过insert/update发送数据时,DB中的值总是错误的。任何人都可以告诉我如何通过Java发送包含中文或其他字符的SQL Apache DBCP配置: driverClassName=org.postgresql.D
convert\u to(column1,'SQL\u ASCII')
,然后在java中使用newstring(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();
String sql=“从public.tbl\u users中选择用户id,第一个名称,转换为(第一个名称,'sql\u ascii')第一个名称,最后一个名称,转换为(最后一个名称,'sql\u ascii')最后一个名称1”;
结果集rs=stmt.executeQuery(sql);
列表=新的ArrayList();
ResultSetMetaData md=rs.getMetaData();
int columnCount=md.getColumnCount();
while(rs.next()){
Map rowData=newhashmap();
对于(int i=1;我避免SQL\u ASCII
您应该使用UTF8
的服务器编码,而不是SQL\u ASCII
文档对此问题非常清楚,甚至包括一条警告,不要做你正在做的事情。引用(我的重点):
SQL\u ASCII设置的行为与其他设置有很大不同。当服务器字符集为SQL\u ASCII时,服务器根据ASCII标准解释字节值0-127,而字节值128-255被视为未解释的字符。当设置为SQL\u ASCII时,不会进行编码转换。因此,此设置g与其说是一个声明,说明正在使用特定的编码,不如说是一个声明,表明对编码一无所知。在大多数情况下,如果您正在处理任何非ASCII数据,使用SQL\u ASCII设置是不明智的,因为PostgreSQL将无法通过转换或验证非ASCII字符来帮助您
使用UTF8
使用UTF8
编码,意思是。这可以处理包括中文在内的任何语言的字符
而UTF8
编码允许Postgres在Postgres 10及更高版本中使用for
Java也使用编码。只需让您的JDBC驱动程序处理Java和数据库之间的文本封送。您以“Here is…”开头,但没有包含任何代码或代表日期()。您还没有清楚地演示您可能已经做了什么来尝试解决这个问题。我使用DBCP连接DB:connectionProperties=useUnicode=true;characterEncoding=GBK;allowEncodingChanges=false…@Alex提供了对您的问题的进一步详细编辑,而不是评论。什么版本的Postgres?非常感谢您的评论。PostgreSQL版本为8.2.44,驱动程序为官方JDBC驱动程序8.4-702.jdbc4,数据源为apache commons dbcp版本1.4。无论如何,非常感谢您的回答,但数据库不在我的控制之下。。。。