У меня проблема с прямой вставкой в базу данных иностранных символов, таких как символы «ó, č, ĕ, ř». не работает даже с моим php-интерфейсом, чтобы убедиться, что нет преобразования или другой кодировки. Таким образом, я использую вход в psql напрямую, и вот моя настройка:
server_encoding ----------------- UTF8 (1 row)
а также
client_encoding ----------------- UTF8 (1 row)
база данных:
Name | Owner | Encoding | Collate | Ctype | my_db | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
Поэтому я думаю, что проблем не должно быть.
Я создал это:
CREATE TABLE test (a text);
и теперь я хочу вставить какой-то текст
INSERT INTO TEST (a) ('ó');
И есть сообщение:
ERROR: invalid byte sequence for encoding "UTF8": 0xf327293b
Есть ли кто-нибудь, кто может мне помочь? похоже, что он игнорировал мою кодировку ввода, или я действительно не знаю.
РЕДАКТИРОВАТЬ :
моя конфигурация терминала
LANG=en_US.UTF-8 LANGUAGE=en_US:en LC_CTYPE="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_COLLATE="en_US.UTF-8" LC_MONETARY="en_US.UTF-8" LC_MESSAGES="en_US.UTF-8" LC_PAPER="en_US.UTF-8" LC_NAME="en_US.UTF-8" LC_ADDRESS="en_US.UTF-8" LC_TELEPHONE="en_US.UTF-8" LC_MEASUREMENT="en_US.UTF-8" LC_IDENTIFICATION="en_US.UTF-8" LC_ALL=
EDIT2:
my_db=# \encoding UTF8
EDIT3: psql из файла
файл
file -bi test text/plain; charset=utf-8
выполнять
ERROR: syntax error at or near "'Ăł'" LINE 1: INSERT INTO tes (a) ('Ăł');
EDIT4:
set client_encoding='latin1';
это работает в psql, но мне нужно, чтобы он работал с utf8. Я знаю, что это возможно, я использовал эту настройку каждый раз с базами данных mysql, и это работает как шарм.
Для моего драйвера jdbc это UTF8.
EDIT5:
Вот что я делаю здесь: нажмите мне
Перед его сохранением я вижу его – так что php работает нормально, но после этого, когда я прочитал его из базы данных, я не вижу его. Это потому, что я приблизился к DB в psql, чтобы посмотреть, что происходит. Похоже, серверная проблема. Возможно ли, что сервер не может обрабатывать эти символы?
EDIT6:
Конфигурация Tomcat
-Dfile.encoding=UTF8
Кодировка URI также установлена в UTF8. Где может быть эта проблема? 🙁
Если ваша оболочка находится в кодировке latin1, как видно из комментариев, это исправит ее:
set client_encoding = 'latin1';
Если вы не хотите изменять системную кодировку клиента, вы можете изменить значение по умолчанию в postgresql.conf
client_encoding = latin1
Или измените кодировку символов по умолчанию PHP:
default_charset = "utf-8";
Сделайте это также в Apache или любом другом сервере http, который вы используете, config:
AddDefaultCharset UTF-8
Еще один отладочный тест (я все еще думаю, что это конечная вещь): можете ли вы написать инструкцию insert в кодированном файле UTF-8 и попытаться запустить команду из файла? Например:
psql my_db -U postgres -f <utf8-encoded-file>
Если это хорошо работает, то оно возвращается к терминалу как-то …
Согласно комментариям, вы используете PuTTY, который по умолчанию используется для латинского-1. Вам нужно настроить PuTTY на использование UTF-8. Просто настройка локали сервера не принесет никакой пользы, если ваша кодировка PuTTY не соответствует тому, что заявляет окружающая среда.
Откройте PuTTy. Под заголовком «Настройки окна» выберите подменю «Перевод». Установите «Удаленный набор символов» на «utf-8». На вкладке Шрифты убедитесь, что вы используете шрифт с разумным охватом Unicode. Затем в меню сеанса введите имя в текстовое поле «сохраненные настройки» и введите «сохранить», чтобы сохранить настройки в качестве профиля. Вы можете переопределить профиль «Настройки по умолчанию», выбрав его и выбрав «Сохранить», но это повлияет на все будущие подключения и новые профили, поэтому может возникнуть путаница, если вы используете другие серверы, которые не являются utf-8.
(Эти инструкции основаны на моем PuTTY на Fedora 18, в некоторых версиях Windows могут быть некоторые различия в деталях пользовательского интерфейса. Если есть сомнения, найдите, как установить PuTTY для использования utf-8.)