Вставить / обновить в кодировку sql_ascii postgreSQL

Вот postgreSQL с серверной кодировкой SQL_ASCII. Когда я получаю данные, я должен использовать функцию convert_to(column1, 'SQL_ASCII') в select, а затем использовать new String(value1, 'GBK') в java, чтобы получить правильное значение.

Но когда я отправляю данные путем вставки / обновления, значение в БД всегда ошибочно. Кто-нибудь может сказать мне, как отправить SQL, включая китайский или другой символ, с помощью Java?

Конфигурация 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

SQL-запрос в java:

    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();

Но как мне делать при вставке / обновлении?

Вы начинаете с «Вот ...», но не включаете код или репрезентативную дату (минимальный воспроизводимый пример). Вы четко не продемонстрировали, что вы могли сделать, чтобы попытаться решить эту проблему в первую очередь. Как спросить

AJD 08.04.2018 05:01

И я использую DBCP для подключения к БД: connectionProperties = useUnicode = true; characterEncoding = GBK; a‌ llowEncodingChanges = ‌ false .....

Alex 08.04.2018 05:17

@Alex Предоставьте дополнительные сведения в виде правок к вашему вопросу, а не комментариев.

Basil Bourque 08.04.2018 05:18

Какая версия Postgres?

Basil Bourque 08.04.2018 05:19

Большое спасибо за ваш комментарий. Версия PostgreSQL - 8.2.44, драйвер - официальный драйвер JDBC 8.4-702.jdbc4, источник данных - apache commons-dbcp версии 1.4.

Alex 09.04.2018 09:22
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
5
825
1

Ответы 1

Избегайте SQL_ASCII

Вы должны использовать серверную кодировку UTF8, а не SQL_ASCII.

В документации по этому поводу довольно ясно сказано и даже есть предупреждение не делать то, что вы делаете. Процитирую (выделено мной):

The SQL_ASCII setting behaves considerably differently from the other settings. When the server character set is SQL_ASCII, the server interprets byte values 0-127 according to the ASCII standard, while byte values 128-255 are taken as uninterpreted characters. No encoding conversion will be done when the setting is SQL_ASCII. Thus, this setting is not so much a declaration that a specific encoding is in use, as a declaration of ignorance about the encoding. In most cases, if you are working with any non-ASCII data, it is unwise to use the SQL_ASCII setting because PostgreSQL will be unable to help you by converting or validating non-ASCII characters.

Используйте UTF8

Используйте кодировку UTF8, что означает UTF-8. Это может обрабатывать символы для любого языка, включая китайский.

А кодировка UTF8 позволяет Postgres использовать новая поддержка для Международные компоненты для Unicode (ICU) в Postgres 10 и новее.

Java также использует кодировку Юникод. Просто позвольте вашему JDBC-драйверу обрабатывать маршалинг текста между Java и базой данных.

В любом случае, большое спасибо за ваш ответ, но БД не находится под моим контролем ....

Alex 08.04.2018 05:34

Другие вопросы по теме