Perl-приложение и запросы с акцентированными символами с использованием postgres
Это было десятилетие, я работал с Postgres и Perl.
В одном из моих самых старых до сих пор работающих приложений, словаре правительственных адресов и ведомственных обязанностей, есть проблемы с обработкой терминов запроса, содержащих символы с акцентом, например köln
, Другими словами, всякий раз, когда термин запроса содержит акцентированный символ (в основном умлауты), возвращается 0 результатов.
Я должен упомянуть, что это происходит только при использовании этого приложения с Postgres в качестве базы данных. Если я переключаюсь на MySQL5 (те же данные), те же запросы работают правильно.
Пытаясь отследить причину этой проблемы, я проверил следующее:
- База данных Postgres - UTF-8 (с помощью команды
show server_encoding;
) - Кодировка клиента Postgres также UTF8 (используя
show client_encoding;
) - Если я использую монитор Postgres и выполняю тот же SQL-запрос, что и приложение, используя акцентированные символы в термине запроса, я получаю правильные результаты
- Само приложение Perl обрабатывает UTF-8, HTML-заголовок установлен правильно, содержимое вывода выводится правильно и не искажается
- Все файлы кода Perl, сценарии, файлы пакета.pm и шаблоны имеют кодировку UTF-8 (я проверил это с
file --mime perl_file_name
) - Я возился с подключением к базе данных, установив
$self->{dbh}->{pg_enable_utf8} = 1;
и / или$self->{dbh}->do("SET CLIENT_ENCODING TO 'UTF8';");
и / или$self->{dbh}->do("SET NAMES 'UTF8';");
без изменений - Я обновил
DBD::Pg module
до версии 3.6.2, без изменений.
Так что я почти не знаю, что еще нужно проверить или попытаться заставить Postgres работать полностью. Как упоминалось в моем вступлении, то же самое приложение, использующее MySQL в качестве базы данных, работает безупречно.
2 года назад приложение было изменено для обработки данных UTF-8, я не делал эти изменения самостоятельно, но, насколько я могу видеть в коде (по сравнению с кодом в моем репозитории GIT), это всего лишь HTML UTF8-Header print "Content-type: text/html; charset=utf-8\n\n";
и несколько не связанных между собой частей шаблона. Возможно, это изменение где-то является источником всех проблем, но я не знаю, что такое esp. настроить для Postgres.
Текущая версия Perl 5.22.1, с использованием Apache/2.2.22 (Ubuntu). Конфигурация vhost проста:
AddHandler cgi-script .cgi .pl
ScriptAlias /...abs-path-to-app.../cgi-bin/
<Directory "/...abs-path-to-app.../cgi-bin/">
AllowOverride None
Options +Indexes +ExecCGI +MultiViews +SymLinksIfOwnerMatch
<IfVersion < 2.4>
Allow from all
</IfVersion>
<IfVersion >= 2.4>
Require all granted
</IfVersion>
Allow from all
</Directory>
Postgres - это версия 9.1.24.
Редактировать:
Collate
а также Ctype
установлен в en_US.UTF-8
, Encoding
установлен в UTF-8
для рассматриваемой базы данных. Взглянув на столы, все character varying
использование столбцов pg_catalog."default"
сверка. проведение show lc_collate;
шоу уже упоминалось en_US.UTF-8
,
Edit2:
С использованием DBD::Pg
флаг pg_enable_utf8
и установив его 0
Кажется, получилось, и я получил ожидаемые результаты. Использование значения, отличного от 0
например '-1or
1` не работает. Я опробовал этот флаг (еще раз) сразу после подключения к базе данных. На самом деле я должен это проверить, так как до сих пор не понимаю, что происходит.