0

我在 PostgreSQL 数据库中有一个函数,可以在服务器中搜索纯 txt 文件并处理文件中的数据。LATIN1由于上传的文件格式 ( SET client_encoding ='LATIN1';) ,SQL 函数会更改客户端编码。当我在本地(使用 PgAdmin)执行该函数时,它可以工作,但是当我使用 JPA Native Query 执行该函数时,我收到此错误:

Internal Exception: org.postgresql.util.PSQLException: The server's client_encoding parameter was changed to LATIN1. The JDBC driver requires client_encoding to be UTF8 for correct operation.

这是我的 JPA 函数:

public boolean importFile() {
    boolean res = false;

    try {
        getEntityManager().getTransaction().begin();
        getEntityManager().createNativeQuery("SELECT import()").executeUpdate();
        getEntityManager().getTransaction().commit();
        res = true;

    } catch (Exception e) {
        e.printStackTrace();
        getEntityManager().getTransaction().rollback();
        System.err.println("Error: " + e.getMessage());
    }

    return res;
}

如果重要的话,我使用的是 EclipseLink(JPA 2.1)、JSF 2.2 (PrimeFaces 6.1)、PostgreSQL 9.5.8。

4

1 回答 1

0

如果要在client_encoding函数调用期间更改设置而不影响会话状态,可以将SET子句附加到函数本身:

CREATE FUNCTION import() RETURNS void
SET client_encoding = 'LATIN1'
AS ...

尽管如果您的函数是通过 加载文件COPY,则无需更改client_encoding设置;COPY您可以在命令本身中指定文件编码:

COPY my_table
FROM '/path/to/my_file'
ENCODING 'LATIN1'
于 2018-05-19T13:23:05.747 回答