Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск слов состоящих ровно из 4 символов от А-Я и 
:(
    Опции темы
kilogram
Дата 28.6.2012, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 19.3.2012

Репутация: 1
Всего: 0



Вот так пробую не выводит ничего вообще в результате:
Код
select name1 from cat where name1 REGEXP "^[А-Яа-я]{4}$";

и так не пашет:
Код
select name1 from cat where name1 REGEXP "^.{4}$";

и так не хочет:
Код
select name1 from cat where name1 REGEXP "^....$";

и так:
Код
select name1 from cat where name1 REGEXP "^\w{4}$";


Вот такая таблица, фото ниже. Нужно чтобы возвратило слова состоящие из 4 символов.

Вот так работает, но я хотел бы регуляркой научиться такие фокусы

Код

select name1 from cat where name1 LIKE '____';

Как сделать такое же регуляркой?
user posted image

Это сообщение отредактировал(а) kilogram - 28.6.2012, 13:02
PM MAIL   Вверх
Zloxa
Дата 28.6.2012, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Осмелюсь предположить что дело в мультибайте

Цитата

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.

>>

Это сообщение отредактировал(а) Zloxa - 28.6.2012, 14:36


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Сумасшедший
Дата 28.6.2012, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чилавек-Каропка
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 15.8.2004
Где: Москва

Репутация: 4
Всего: 107



Кодировка?
Код
SELECT `name1`, LENGTH(`name1`) FROM `cat`
 показывает похожие цифры?


--------------------
Однажды ты спросишь, а я отвечу: "Время ожидания специалиста - 10 минут". Ты бросишь трубку, так и не узнав, что Ваш звонок очень важен для нас!
PM MAIL WWW Jabber   Вверх
kilogram
Дата 28.6.2012, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 19.3.2012

Репутация: 1
Всего: 0



Код

SELECT `name1`, LENGTH(`name1`) FROM `cat`


Показывает такое:
user posted image

PM MAIL   Вверх
Сумасшедший
Дата 28.6.2012, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чилавек-Каропка
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 15.8.2004
Где: Москва

Репутация: 4
Всего: 107



Код

SELECT `name1` FROM `cat` WHERE (CONVERT (`name1` USING latin1)) REGEXP CONVERT ('^[А-я]{4}$' USING latin1);


Это сообщение отредактировал(а) Сумасшедший - 28.6.2012, 14:40


--------------------
Однажды ты спросишь, а я отвечу: "Время ожидания специалиста - 10 минут". Ты бросишь трубку, так и не узнав, что Ваш звонок очень важен для нас!
PM MAIL WWW Jabber   Вверх
kilogram
Дата 28.6.2012, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 19.3.2012

Репутация: 1
Всего: 0



А что это вы сделали что заработало? Причем здесь кодировка latin1 если не секрет из-за которой оно заработало?
PM MAIL   Вверх
Сумасшедший
Дата 28.6.2012, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чилавек-Каропка
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 15.8.2004
Где: Москва

Репутация: 4
Всего: 107



Как выше процитировал Zloxa, REGEXP не особо хорошо работает с многобайтными символами (которые у Вас используются, судя по результатам вывода длины строки).
CONVERT в данном запросе приводит представление `name1` в каждой записи в однобайтную кодировку, и сравнивает с регулярным выражением, приведённым в такую же однобайтную кодировку. Т.е. с таким же успехом можно latin1 заменить на любую другую однобайтную кодировку. Например:
Код

SELECT `name1` FROM `cat` WHERE (CONVERT (`name1` USING cp1251)) REGEXP CONVERT ('^[А-я]{4}$' USING cp1251);

выполнится с точно таким же результатом.

Это сообщение отредактировал(а) Сумасшедший - 28.6.2012, 16:40


--------------------
Однажды ты спросишь, а я отвечу: "Время ожидания специалиста - 10 минут". Ты бросишь трубку, так и не узнав, что Ваш звонок очень важен для нас!
PM MAIL WWW Jabber   Вверх
kilogram
Дата 28.6.2012, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 19.3.2012

Репутация: 1
Всего: 0



Спасибо, буду всегда использовать теперь CONVERT если что.
PM MAIL   Вверх
Zloxa
Дата 28.6.2012, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(kilogram @  28.6.2012,  17:50 Найти цитируемый пост)
буду всегда использовать теперь CONVERT если что. 

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

Вопрос в зал : MySQL умеет создавать отдельные таблицы, поля  в отличной от других кодировке?

Это сообщение отредактировал(а) Zloxa - 28.6.2012, 16:54


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Сумасшедший
Дата 28.6.2012, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чилавек-Каропка
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 15.8.2004
Где: Москва

Репутация: 4
Всего: 107



Цитата(kilogram @  28.6.2012,  16:50 Найти цитируемый пост)
всегда использовать теперь CONVERT

Слишком ресурсоёмко при большом количестве данных. Если уж не следовать рекомендации Zloxa, то тогда целесообразнее сделать дополнительное поле с уже сконвертированными значениями и использовать его как ключ для поиска.

Zloxa,
Код

CREATE TABLE `tbl` (
    str1 CHAR(10) CHARSET 'cp1251',
    str2 CHAR(10) CHARSET 'latin1',
    str3 CHAR(15) COLLATE 'utf8_general_ci'
) DEFAULT charset 'koi8r';
Код







Это сообщение отредактировал(а) Сумасшедший - 28.6.2012, 17:31


--------------------
Однажды ты спросишь, а я отвечу: "Время ожидания специалиста - 10 минут". Ты бросишь трубку, так и не узнав, что Ваш звонок очень важен для нас!
PM MAIL WWW Jabber   Вверх
Zloxa
Дата 28.6.2012, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(Сумасшедший @  28.6.2012,  18:31 Найти цитируемый пост)
Слишком ресурсоёмко при большом количестве данных.

Я точно не уверен. Мне кажется на конверсию чарсета будут уходить копейки ресурса, в сравнением с ресурсом, требуемым для регекспа. Если заботиться производительностью, регексп лучше вообще в сторону. Впрочем, как и like '___'.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Сумасшедший
Дата 28.6.2012, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чилавек-Каропка
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 15.8.2004
Где: Москва

Репутация: 4
Всего: 107



Бывает, что без регэкспов в запросах никак:( Особенно в адресах РФ, когда названия городов улиц вводятся вкривь и вкось, а КЛАДР по некоторым причинам не используется.
Для самоудовлетворения сделал тестик на миллионе записей по поиску слов, состоящих из 4-х символов, на машине, обслуживающей только мою тестовую базу. В таблице были три поля: test_id - id записи, utf8 - строка длиной 1..16 символов в utf8 и cp1251 - та же строка, что и в utf8, только сконвертированная в cp1251.
Поиск с конвертацией поля utf8 ~0.75 sec
Поиск по cp1251 ~0.52 sec

Добавлено через 1 минуту и 17 секунд
Но в целом ты прав - от этого стоит уходить быстро, решительно и приложив руки к нужному месту.


--------------------
Однажды ты спросишь, а я отвечу: "Время ожидания специалиста - 10 минут". Ты бросишь трубку, так и не узнав, что Ваш звонок очень важен для нас!
PM MAIL WWW Jabber   Вверх
Zloxa
Дата 28.6.2012, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(Сумасшедший @  28.6.2012,  22:22 Найти цитируемый пост)
Поиск с конвертацией поля utf8 ~0.75 sec
Поиск по cp1251 ~0.52 sec

хммм порядка 40%. Я ожидал 10-15%

Добавлено через 14 секунд
Спасибо за тест. Это было интересно



--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
kilogram
Дата 1.7.2012, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 19.3.2012

Репутация: 1
Всего: 0



То есть использовать вариант является не целесообразным? А какой тогда выход если нужно такое условие?
Код

SELECT `name1` FROM `cat` WHERE (CONVERT (`name1` USING cp1251)) REGEXP CONVERT ('^[А-я]{4}$' USING cp1251);


Кстати, попробовал так, что-то не работает:
Код

select name1 from cat where (CONVERT(name1 using utf8)) REGEXP CONVERT('^[А-я]{8}$' using utf8);

PM MAIL   Вверх
Zloxa
Дата 2.7.2012, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(kilogram @  1.7.2012,  21:20 Найти цитируемый пост)
что-то не работает


Цитата(kilogram @  1.7.2012,  21:20 Найти цитируемый пост)
using utf8

Человеческим же языком написано - на многобайтной кодировке - не предсказуемый результат. utf-8 - мультибайтная кодировка. Каждый символ может быть представлен от одного до четырех байт.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0551 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.