Почему Unicode Charater θ не поддерживается в PGSQL

Я работал с Postgresql с C++ и пытался вставить символ юникода αβγδεζηθ.

Запустил запрос вставки в некоторую таблицу базы данных и обнаружил, что "θ" не является поддерживаемым символом.

Для этого я запускаю GDB. для этого символа, то есть 'θ', он показывает иероглифический символ.

  1. Могу ли я найти набор символов, поддерживаемый Postgresql.
  2. Поддерживает ли Pgsql этот символ?
  3. Есть ли способ поддержать этого персонажа.

Примечание: 1. Я использую C++ для запуска этой команды. и это не сохраняет это значение. 2. База данных совместима с UTF8, потому что, когда я удаляю этот "θ", запрос на вставку запускается успешно.

1 ответ

Решение

Да, PostgreSQL поддерживает θ, характер U+03b8Греческая строчная буква Theta, как в кодировке Unicode, так и в буквальной форме:

regress=> SELECT 'θ', E'\u03b8';
 ?column? | ?column? 
----------+----------                                                                                                                                                          
 θ        | θ                                                                                                                                                                  
(1 row)                                                                                                                                                      

По-видимому, кодировка вашей базы данных или кодировка клиента не поддерживают ее, или, возможно, более вероятно, учитывая ваше упоминание о "бред", ваш client_encoding не соответствует кодировке данных, которые вы на самом деле отправляете.

Проверьте кодировку базы данных с \l в PSQL или SHOW server_encoding;, Получить кодировку клиента с SHOW client_encoding; с клиентом соединение с проблемой.

Я бы сказал, что вы, вероятно, отправляете данные UTF-8 или UTF-16 на сервер, но сообщаете серверу, что это iso-8859-1 или windows-1252 или наоборот. Хоть θ не в этих кодировках; вы должны использовать что-то еще или отправлять данные, которые уже искажены другим недопустимым преобразованием, прежде чем даже попасть в PostgreSQL.

Было бы полезно, если бы вы показали:

  • Точный "бред" произведенный и соответствующий ввод
  • Необработанные байты строки C, которые вы отправляете в PostgreSQL, в виде шестнадцатеричных кодов
Другие вопросы по тегам