регистронезависимый RLIKE ?

becool

Новичок
регистронезависимый RLIKE ?

Вот нужно выбрать данные с таким условием: WHERE `txt` RLIKE="^слово";
В базе есть поле txt со значением "СЛоВо",
есть возможность найти его, через регулярное выражение?
щас делается что то типа такого: WHERE LOWER(`txt`) RLIKE="^'.strtolower($w).'"
 

Gas

может по одной?
becool
используй LIKE, пока не вижу зачем тут реги.
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
becool
[telepat_mode]
SHOW FULL COLUMNS FROM `table` LIKE 'txt'
Вероятнее всего
Collation *_cs|*_bin
[/telepat_mode]
 

becool

Новичок
HraKK хм, почему тогда RLIKE отрабатывает только если учесть регистр? Может потому как русский текст? Хотя LIKE работает без учёта регистра. видать ошибка в рег.выражениях...

P.s.
Регулярки могут быть разные я привёл самый простой пример.

-~{}~ 07.04.08 20:52:

Mr_Max чую, что то умное сказал, но я ничего не понял. Кодировка базы utf-8, сравнения везде utf8_general_ci
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Хотя LIKE работает без учёта регистра
Ты неправ.
Так будет если collation поля *_ci (case insensitive)
Tак-же будет и с регекспом.

А самом поле Collation?
Тогда моя х/з
 

Gas

может по одной?
На cp1251 rlike регистр не учитывает, а вот на utf8_general_ci вроде нет.
Вполне возможно дело в этом
Warning
The REGEXP and RLIKE operators work in byte-wise fashion, so they are not multi-byte safe and may produce unexpected results with multi-byte character sets. In addition, these operators compare characters by their byte values and accented characters may not compare as equal even if a given collation treats them as equal.
becool
Так что всё lower или upper нормально, всё равно с регами полный перебор идёт. Только я бы php-шный strtolower заменил на ф-цию mysql
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
На cp1251 rlike регистр не учитывает, а вот на utf8_general_ci вроде нет.
Хм. Прочитал несколько раз.
Можно трактовать по всякому.
Особенно последнее нет ;)

У меня вот так:
PHP:
mysql> SHOW FULL COLUMNS FROM `collation_test` LIKE 'txt';
+-------+--------------+-------------------+
| Field | Type         | Collation         |
+-------+--------------+-------------------+
| txt   | varchar(255) | cp1251_general_ci |


Запросы
mysql> SELECT * FROM `collation_test` WHERE txt RLIKE '^asdf';
mysql> SELECT * FROM `collation_test` WHERE txt LIKE 'asdf';
Возвращают
+------+
| txt  |
+------+
| aSdf |
| aSdF |
| ASDF |
| aSdF |
+------+
4 rows in set (0.00 sec)

mysql> SHOW FULL COLUMNS FROM `collation_test` LIKE 'txt';
+-------+--------------+-------------------+
| Field | Type         | Collation         |
+-------+--------------+-------------------+
| txt   | varchar(255) | cp1251_general_cs |
+-------+--------------+-------------------+

Возвращают Empty set (0.00 sec)

Точно так=же если кодировка в UTF.

mysql> SHOW FULL COLUMNS FROM `collation_test` LIKE 'txt';
+-------+--------------+-----------+
| Field | Type         | Collation |
+-------+--------------+-----------+
| txt   | varchar(255) | utf8_bin  |
+-------+--------------+-----------+
Возвращает нулевой результат.
Поиск регистрозависимый

если  utf8_general_ci
то регистронезависимый.
 

Gas

может по одной?
Можно трактовать по всякому.
скомкано написал :)
REGEXP для однобайтовых кодировок и case-insensetive collation (например cp1251_general_ci) работает правильно - без учёта регистра.

Для многобайтовых кодировок (если и символы представляются более чем одним байтом) независимо от collation - сравнение идёт case sensitive. Так как мануал говорит
"In addition, these operators compare characters by their byte values"
 

HraKK

Мудак
Команда форума
Gas
Да ну? А ты попробуй.

+-------+--------------+-------------------+
| Field | Type | Collation |
+-------+--------------+-------------------+
| txt | varchar(255) | cp1251_general_ci |

mysql> SELECT * FROM `collation_test` WHERE txt RLIKE '^asdf';
mysql> SELECT * FROM `collation_test` WHERE txt LIKE 'asdf';
Возвращают
+------+
| txt |
+------+
| aSdf |
| aSdF |
| ASDF |
| aSdF |
+------+
4 rows in set (0.00 sec)
 

Gas

может по одной?
HraKK
так я и написал
(например cp1251_general_ci) работает правильно - без учёта регистра
или я путаюсь в понятиях, имею ввиду
"без учёта регистра" == case-insensetive
 

becool

Новичок
Gas спасиба за это: "In addition, these operators compare characters by their byte values"
Я, блин, подозревал, но небыло доказательств. Отчего же like работает как нужно, другой принцип работы?
 
Сверху