UTF-8 и поиск по ~ ^абв

DockerMan
Дата: 22.06.2004 15:30:48
Приветствую!

Есть таблица в UTF-8. Сейчас с ней работаю в psql терминале.

Как сделать чтобы запрос типа

SELECT name FROM tab WHERE name ~ convert('^абв', 'koi8-r', 'utf-8');

использовал индекс. client_enconding выставлен в 'koi8-r'.

Чтобы использовался индекс при сравнении по равенству строк, пришлось использовать конструкцию:

SELECT name FROM tab WHERE name = convert('абв', 'koi8-r', 'utf-8')::bpchar;

Но не получается сделать что-то подобное для сравнения ~ '^абв', т. е. Postfix делает линейный поиск, я понимаю что здесь проблема с типами. Поиск по ~ '^abc' без convert() работает с индексом.

Есть идеи? Заранее спасибо.
wbear
Дата: 22.06.2004 17:38:07
помойму только если сделать функцию реализовывающую ~ и потом с ней сделать еще один индекс.. в доках вроде было .. а тотже самый индекс помойму не получится
DockerMan
Дата: 23.06.2004 00:46:41
Уточню ситуацию. PostgreSQL 7.4.2 на FreeBSD. База в UTF-8, локаль KOI8-R.

Обнаружилась ещё одна особенность, индекс используется в ~ '^abc' и like 'abc%' если строка, с которой производится сравнение, задана как char(n), если строка задана как varchar(n), то индекс не используется и для английских букв в ~ '^abc' и like 'abc%'. Т.е. при смене типа перестал работать индекс и для английский букв.

Я подозреваю что всё дело в типах (PostgreSQL не использует индекс если выражение не совпадает с типом проиндексированного столбца).
DockerMan
Дата: 23.06.2004 02:20:09
DockerMan
Т.е. при смене типа перестал работать индекс и для английский букв.

И так и так работает для английских букв, просто PostgreSQL в моём тесте, как я понял, не успел набрать статистики для того чтобы начать использовать индекс.