Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 插入/更新sql\U ascii编码postgreSQL_Java_Postgresql_Jdbc_Encoding_Gbk - Fatal编程技术网

Java 插入/更新sql\U ascii编码postgreSQL

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

这是一个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.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。无论如何,非常感谢您的回答,但数据库不在我的控制之下。。。。