Отправляет email-рассылки с помощью сервиса Sendsay

Postgresql: ilike в utf8 не работает.

Не работает ilike в postgresql в utf8 для русского языка. Т.е.

select * from a where b ilike '%Sgs%';

срабатывает для "sgsgsgsgsg", а

select * from a where b ilike '%помни%';

не срабатывет для "Помни бла-бла", только

select * from a where b ilike '%Помни%';

срабатывает.

Федора 6, локаль utf8,
postgresql-libs-8.1.4-1.1
postgresql-pl-8.1.4-1.1
postgresql-8.1.4-1.1
postgresql-server-8.1.4-1.1

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 31305; Возраст листа: 1369; Участников: 1440
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/659829

Ответить   Strong Tue, 24 Apr 2007 22:53:34 +0700 (#659829)

 

Ответы:

В сообщении от 1177444414 секунд после начала Эпохи Strong написал(а):

Что показывает

SHOW LC_CTYPE;

?

Что показывает

\l

?

Ответить   Konstantin Korikov Wed, 25 Apr 2007 04:27:51 +0300 (#659900)

 

On Wed, 25 Apr 2007 04:27:51 +0300 Konstantin Korikov
<lostcl***@i*****.ua> wrote:

lc_ctype
en_US.UTF-8
(1 row)

List of databases
Name | Owner | Encoding
------------+----------+A | postgres | UTF8
B | D | UTF8
C | E | UTF8
postgres | postgres | UTF8
template0 | postgres | UTF8
template1 | postgres | UTF8
(6 rows)

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 31387; Возраст листа: 1370; Участников: 1441
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/660191

Ответить   Strong Thu, 26 Apr 2007 01:12:30 +0700 (#660191)

 

В сообщении от 1177444414 секунд после начала Эпохи Strong написал(а):

Делайте

select * from a where lower(b) like '%помни%';

Для этого есть три причины:

1. ILIKE действительно не работает так как надо (сам не знаю почему).
2. ILIKE - это нестандартный оператор.
3. При поиске с like есть возможность использовать индексы.

Ответить   Konstantin Korikov Thu, 26 Apr 2007 06:39:25 +0300 (#660270)

 

On Thu, 26 Apr 2007 06:39:25 +0300 Konstantin Korikov
<lostcl***@i*****.ua> wrote:

Так, он тогда "Помни" не найдёт...
Похоже, ошибка в работе, и остаётся ждать когда исправят...

PS Может, есть обходной мудрёный путь, помимо перебора всех букв? :)
Я вызываю это из Perl - это насчёт мудрёности, к сведению.
Спасибо за Ваш ответ.

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 31420; Возраст листа: 1371; Участников: 1446
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/660455

Ответить   Strong Fri, 27 Apr 2007 00:44:15 +0700 (#660455)

 

В сообщении от 1177623855 секунд после начала Эпохи Strong написал(а):

Найдет. Значение b перед сравнением преобразуется в нижний регистр.

Если используете placeholder'ы то можно записать примерно так:

$sth = $dbh->prepare("select * from a where lower(b) like lower(?)");
$sth->execute("%пОмНи%");

Вы про индексы?

CREATE INDEX b_l_pat_index ON a (lower(b) varchar_pattern_ops);

Ответить   Konstantin Korikov Fri, 27 Apr 2007 07:54:21 +0300 (#660529)

 

On Fri, 27 Apr 2007 07:54:21 +0300 Konstantin Korikov
<lostcl***@i*****.ua> wrote:

Здорово! Я как-то не подумал, что и образец можно в нижний регистр
преобразовать. Спасибо, Константин!

Нет. Вообще, любые соображения.

А вот, ещё наткнулся на проблему в перле: если я пытаюсь теперь
выделить в результате поиска искомое, в html-формате, то:

1. $tmp[0]=~s#$req#<font style="color: \#cc0000">$req</font>#ig; - не
срабатывает (здесь в tmp - ответ БД, req - запрос формы html c
charset=UTF-8),

2. использование use utf8; решает проблему только для переменных, явно
заданных, но не ответа БД.

Как тут поступают с utf8?

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 31444; Возраст листа: 1373; Участников: 1444
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/660738

Ответить   Strong Sat, 28 Apr 2007 02:44:35 +0700 (#660738)

 

В сообщении от 1177717475 секунд после начала Эпохи Strong написал(а):

Точно не скажу, давно уже Перлом не пользуюсь. Во первых, в Перле 5.X
есть два типа строк: строки, закодированные юникодом и строки,
представляющие байты (или октеты, как кому больше нравится). Убедитесь
что в $tmp[0] и $req используется один и тот же тип строки, и если там
просто байты, убедитесь что они в одинаковой кодировке. Во вторых,
пропустите шаблон через функцию quote().

my $req_quoted = quote($req);
$tmp[0] =~ s#$req_quoted#<font и т.д.

A вообще такие вещи нужно делать используя DOM, а не HTML-код,
содержащийся в строке. Ведь где гарантия что подстрока, соответствующая
шаблону в $req не встретится в атрибуте? Например, было

<a title="Превед" href="/">Медвед</a>

а стало

<a title="<font style="color: #cc0000">Превед</font>">Медвед</a>

В третьих, зачем использовать <font style="color: #cc0000">, если можно
<font color="#cc0000"> ?

Ответить   Konstantin Korikov Sat, 28 Apr 2007 21:29:55 +0300 (#660979)