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например '-1or1` не работает. Я опробовал этот флаг (еще раз) сразу после подключения к базе данных. На самом деле я должен это проверить, так как до сих пор не понимаю, что происходит.

0 ответов

Другие вопросы по тегам