Регулярные выражения в mysql для строк UCS-2
От: furang  
Дата: 05.06.12 09:36
Оценка:
Доброго времени суток, Сообщество!
Есть необходимость пользоваться регулярными выражениями в mysql запросах. Пока поля в таблицах были все в utf8 все было нормально. Но появилась необходимость пользоваться регулярными выражениями для полей ucs2. Там ясное дело Эти выражения уже не подходят. и я озадачен что мне делать
Вот например есть такая таблица

CREATE TABLE IF NOT EXISTS `urls` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `url` varchar(2112) COLLATE ucs2_bin NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=ucs2 COLLATE=ucs2_bin AUTO_INCREMENT=1 ;

Надо выбрать url-ы в которых встречаетяс vk.com. Для простоты пока покажу на примере LIKE.

SELECT * FROM `urls` WHERE `url` LIKE '%vk.com%'

Возвращает пустой результат. А вот следующий запрос уже показывает что нужно

SELECT * FROM `urls` WHERE `url` LIKE '%v\0k\0.\0c\0o\0m\0%'


Но для лайка такой костыль еще проконает, а вот для REGEXP уже ясное дело нет. Как можно выкрутиться из подобной ситуации? Можно ли в запросе как-то конвертировать само регулярное выражение или поменять правила сравнения. Или единственный выход — переписать регулярные выражения? Регулярные выражения на данный момент приблизительно такие.
/some=([a-zA-Zа-яА-ЯёЁ0-9]+)/u

Заранее благодарен за внимание.
mysql regexp like ucs2
Re: Регулярные выражения в mysql для строк UCS-2
От: Centaur Россия  
Дата: 05.06.12 16:58
Оценка: +1
Здравствуйте, furang, Вы писали:

F>Есть необходимость пользоваться регулярными выражениями в mysql запросах. Пока поля в таблицах были все в utf8 все было нормально. Но появилась необходимость пользоваться регулярными выражениями для полей ucs2.


Для начала расскажите о причинах, побудивших вас хранить ucs-2 в базе данных. http://www.utf8everywhere.org/

F>SELECT * FROM `urls` WHERE `url` LIKE '%v\0k\0.\0c\0o\0m\0%'

Какой character set вы используете для общения с базой по умолчанию и почему не тот, в котором все строки в базе? (Если у вас в базе строки хранятся в нескольких разных кодировках, срочно к врачу.)

Если connection charset менять нежелательно, попробуйте указать charset литерала, используемого в операциях LIKE или REGEXP:

F>SELECT * FROM urls WHERE url LIKE _ucs2'%vk.com%' COLLATE ucs2_bin
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.