PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи

Страниц (1): [1]

> Найдено сообщений: 5
dumkan Отправлено: 14 Октября, 2013 - 12:59:15 • Тема: INSERT REGEXP - удвоение точек • Форум: SQL и Архитектура БД

Ответов: 7
Просмотров: 55
Что же так все печально в программировании??? Все через какую-то задницу делается Недовольство, огорчение
Потенциально некорректно делать не хочется, потому что если это у меня на Денвере заработает, не факт что на хостинге потом это будет нормально.

А задача была такая:
Есть такое понятие буквенно-цифровой код (БЦК). Применяется для запоминания чисел. Каждому числу сопоставляется пара согласных, 0 -н,м 1 -г,ж 2 -д,т и т.п. Чтобы запомнить число подбирается слово в котором эти согласные идут в нужном порядке, например ГНОМ будет соответствовать числу 100. Слова запоминаются гораздо легче цифр Зная слово легко получить соответствующее число. А вот придумать подходящее слово сходу не получается.
Хотелось написать запрос, который будет в базе по числу искать подходящие слова, что-то типа такого
^[ГЖ][А][АЕИЙОУЪЫЬЭЮЯ]*[НМ][АЕИЙОУЪЫЬЭЮЯ]*[НМ].* (для числа 100)

Собственно говоря каждому слову какое-то одно число соответствует, правильнее наверно будет в базу еще одно поле добавить с этим числом, прочитать слова потихоньку, по одному перевести в числа.
dumkan Отправлено: 14 Октября, 2013 - 08:14:04 • Тема: INSERT REGEXP - удвоение точек • Форум: SQL и Архитектура БД

Ответов: 7
Просмотров: 55
Немного поэкспериментировал еще:
"SELECT word FROM words WHERE word REGEXP '^КАРПОВ$'"; - находит в базе слово КАРПОВ, логично

"SELECT word FROM words WHERE word REGEXP '^КАРП[О]В$'"; - вот такой запрос запись не находит, хотя кажется что в принципе все аналогично

"SELECT word FROM words WHERE word REGEXP '^КАРП[О][О]В$'"; - а вот такая запись слово КАРПОВ в базе находит.

P.S. с LIKE 'КАРП_В' все прокатывает, один символ подчеркивания - одна буква. Но мне надо именно REGEXP разобраться, запрос на самом деле сложнее нужен.

P.S.S. вот что еще вычитал в http://dev[dot]mysql[dot]com/doc/refman/[dot][dot][dot]#operator_regexp


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.
Недовольство, огорчение

P.S.S.S.
сохранил файл в win1251, поля таблицы тоже, запрос:
SELECT word FROM win1251 WHERE word REGEXP '^КАРПОВ$'
выдал ошибку:
Illegal mix of collations (cp1251_general_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation 'regexp'
dumkan Отправлено: 13 Октября, 2013 - 21:18:04 • Тема: INSERT REGEXP - удвоение точек • Форум: SQL и Архитектура БД

Ответов: 7
Просмотров: 55
Мелкий пишет:
dumkan пишет:
такой запрос по идее должен находить

С чего это вдруг?
Не помню ни одного диалекта регулярных выражений, в котором одиночный символ успешно совпадал с двумя символами.


Еще раз проверил, но кажется все правильно, одиночный символ должен совпадать с одним символом - буквой О:

SELECT word FROM words WHERE word REGEXP '^КАРП.В\$'
такой запрос по идее должен находить запись КАРПОВ

Или я что-то не понимаю?
dumkan Отправлено: 13 Октября, 2013 - 19:55:35 • Тема: INSERT REGEXP - удвоение точек • Форум: SQL и Архитектура БД

Ответов: 7
Просмотров: 55
SELECT word FROM words WHERE word REGEXP '^КАРП.В\$'

такой запрос по идее должен находить запись КАРПОВ в таблице (она там есть), но не находит, а вот такой запрос его находит:

SELECT word FROM words WHERE word REGEXP '^КАРП..В\$'

пробовал так:
SELECT word FROM words WHERE word REGEXP '^КАРП[А-Я]В\$' - не находит
SELECT word FROM words WHERE word REGEXP '^КАРП[А-Я][А-Я]В\$ - находит

в чем дело не могу понять? Почему надо удваивать точки или символьный класс? А просто символы нормально ищутся?

P.S.
просто SELECT word FROM words WHERE word REGEXP '^КАРПОВ\$' тоже находит

P.S.S. Это может быть связано с кодировкой многобайтной utf-8?
dumkan Отправлено: 13 Октября, 2013 - 19:42:59 • Тема: Сортировка utf-8 • Форум: Кодировки и все смежное

Ответов: 1
Просмотров: 1498
пытаюсь отсортировать символы с слове таким образом:

echo $word;
$chars=str_split($word);
sort($chars);
$anagramma=implode('',$chars);
echo $anagramma;

$word выводит правильно, вместо $anagramma - крякозябы, причем символов по количеству в 2 раза больше чем в исходном слове. Я так понимаю из-за многобайтной кодировки.

если перекодировать в windows-1251 то все проходит нормально:

echo $word;
$chars=str_split(iconv('UTF-8','windows-1251',$word));
sort($chars);
$anagramma=iconv('windows-1251','UTF-8', implode('',$chars));
echo $anagramma;

Мне кажется так не совсем правильно. Есть ли правильное, элегантное решение?

Страниц (1): [1]
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB