Выполнить функцию PostgreSQL с кодировкой клиента LATIN1 в JPA - PullRequest
0 голосов
/ 19 мая 2018

У меня есть функция в базе данных PostgreSQL, которая ищет простой текстовый файл на сервере и обрабатывает данные внутри файла.Функция SQL изменяет кодировку клиента на LATIN1 из-за формата загруженного файла (SET client_encoding ='LATIN1';).Когда я выполняю функцию локально (с помощью PgAdmin), она работает, но когда я выполняю функцию с помощью собственного запроса JPA, я получаю эту ошибку:

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.

1 Ответ

0 голосов
/ 19 мая 2018

Если вы хотите изменить настройку 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...