Вот 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();
Но как мне делать при вставке / обновлении?
И я использую DBCP для подключения к БД: connectionProperties = useUnicode = true; characterEncoding = GBK; a llowEncodingChanges = false .....
@Alex Предоставьте дополнительные сведения в виде правок к вашему вопросу, а не комментариев.
Какая версия Postgres?
Большое спасибо за ваш комментарий. Версия PostgreSQL - 8.2.44, драйвер - официальный драйвер JDBC 8.4-702.jdbc4, источник данных - apache commons-dbcp версии 1.4.




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 и базой данных.
В любом случае, большое спасибо за ваш ответ, но БД не находится под моим контролем ....
Вы начинаете с «Вот ...», но не включаете код или репрезентативную дату (минимальный воспроизводимый пример). Вы четко не продемонстрировали, что вы могли сделать, чтобы попытаться решить эту проблему в первую очередь. Как спросить