Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > regexp в запросе


Автор: Bulat 11.8.2008, 14:07
Есть запрос:

Код

SELECT GROUP_CONCAT( DISTINCT IF(UPPER(SUBSTR(s_name,1,1)) REGEXP '^[а-я]', UPPER(SUBSTR(s_name,1,1)), '.') SEPARATOR '')
FROM arts


По сути - нужно получить все первые буквы из всех названий и сгруппировать их в виде алфавита(можно не упорядоченного). Если название начинается не с буквы русского алфавита, ставить точку. Однако, данный запрос выдает не только буквы алфавита и "точку" вместо всего, что не является символом русского алфавита, но символы '«' и 'І', возможно в будущем могут цепляться и еще какие-то символы не относящиеся к русскому алфавиту.

Текущий результат запроса

Код

ПМНБГДРЛТИ.УВСКЯЗАОЦЖХШЭЧФЕЩ«ЮЙІ


Пока так и не понял почему это происходит, может есть какие особенности в регулярных выражениях?? (скорее всего, возможно связь с кодировками и т.п.)

кодировка в базе - utf8

"Іміджмейкер із Москви". Название на символ "I".

По символу "«" - тоже есть название начинающееся с данного символа. Но оно должно заменятся на ".", но почему это не происходит??

Автор: ivg 11.8.2008, 22:14
Цитата(Bulat @  11.8.2008,  17:07 Найти цитируемый пост)
Пока так и не понял почему это происходит, может есть какие особенности в регулярных выражениях?? (скорее всего, возможно связь с кодировками и т.п.)

По моему REGEXP в MySQL не умеет работать с мультибайтовыми кодировками. Можно попробовать что то типа такого:
Код

SELECT
    GROUP_CONCAT(
        DISTINCT
            IF(CONVERT(s_name USING cp1251) REGEXP CONVERT('^[ёа-я]' USING cp1251),
                UPPER(SUBSTR(s_name,1,1)),
                '.'
            )
    SEPARATOR '')
FROM arts

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)