Я пытаюсь вставить некоторые строки UTF-8 в базу данных PostgreSQL. Я использую Visual C++ и MFC (это, вероятно, не важно) и настройку проекта «Использовать многобайтовый набор символов» (пытаюсь переключить базу данных в старом устаревшем приложении). Поэтому, когда я выполняю какую-то команду INSERT с каким-то текстом на кириллице "АБВГ", я ожидаю увидеть этот текст в базе данных, но вместо этого вижу это (в DBeaver): "РБВГ. Я вставляю этот текст, преобразуя строку "\xC0\xC1\xC2\xC3" из кодовой страницы 1251 в CP_UTF8.
Когда я меняю системную настройку "Язык для программ, не поддерживающих Юникод" с английского на какую-нибудь кириллицу, например русскую, то фактически вставляется уже не "РР'Р'Р", а "ТВР'Р" . Драйвер Postgres ODBC, по-видимому, использует CP_ACP для интерпретации моих многобайтовых строк. Действительно, если я сейчас попытаюсь вставить "\xC0\xC1\xC2\xC3" напрямую (без преобразования в UTF-8), то в базе данных я увижу "АБВГ". Но мне нужно вставить строки UTF-8, а не подмножество кодовой страницы.
Как указать драйверу ODBC Postgres интерпретировать мои строки как UTF-8 и игнорировать системную настройку «Язык для программ, отличных от Unicode»?
В консоли PSQL для server_encoding
и client_encoding
установлено значение UTF8
.
@Daniel, но в базе данных это выглядит неправильно. Я не могу использовать сортировку в своих запросах.
У вас есть непарные конверсии [input]-->{convert to UTF-8}-->[DB]-->[output]
или [input]-->{convert to UTF-8}-->{convert to UTF-8}-->[DB]-->{convert from UTF-8}-->[output]
, а должно быть [input]-->{convert to UTF-8}-->[DB]-->{convert from UTF-8}-->[output]
. Возможно, вам нужно проверить параметры подключения или не конвертировать данные перед отправкой в базу данных, или программа просмотра использует неправильную кодировку.
Измените строку подключения ODBC DSN, включив в нее следующее: ConnSettings=SET CLIENT_ENCODING TO 'UTF8';
Для cp 1252 ваша строка
ÐБВГ
закодирована в шестнадцатеричном виде как D0,90,D0,91,D0,92,D0,93. При интерпретации как UTF-8 это даетАБВГ
. Поэтому после получения данных из базы данных вам необходимо преобразовать их из UTF-8 в кодовую страницу, используемую для отображения.