Шутки MySQL

Bu-Bu

Привет!Может кто сталкивался с подобной проблемой. Есть таблица URLов. Поиск ведется по Url. Запрос WHERE url='$field' почему-то не всегда срабатывает (не находит). Переделал на url LIKE '%$field%' - все равно не всегда срабатывает. Могут ли быть проблемы из-за знаков ?&=, содержащихся в Url-ах? Уже всю голову изломал, но часть url-ов упорно не находится. Заранее фэнкс!
24 ответа

Bu-Bu

А можешь привести пример на какой запрос гарантированно не находиться URL?


Bu-Bu

В том-то и дело, что гарантий никаких и одинаковые с виду урлы то находятся, то нет. Самое обидное, что PHP-часть скрипта работает как надо, а с MySQL нет взаимопонимания. Чаще всего не "пробиваются" урлы типа http://domen.ru/script.php?page=1&seek=0, т.е. & есть практически во всех урлах, которые не находятся.


Bu-Bu

mysql_real_escape_string() использовать не забываете?


Bu-Bu

mysql_real_escape_string() использовать не забываете?
Попробовал и эту фичу - все равно нет 100%-ного результата. Может вообще преобразовывать в UTF-8 раз на сервере база в UTF? Просто наваждение какое-то. Хоть переделывай все через SQL-файлы.


Bu-Bu

В нормальных урлах в принципе не может быть ничего, что могло бы потребовать использование юникода.


Bu-Bu

В нормальных урлах в принципе не может быть ничего, что могло бы потребовать использование юникода.
Вот тут вы не правы. Переход на UTF-8 все-таки что-то нарушил в привычных скриптах. В итоге мне пришлось переделать все обращения к базе, потому как нормально не работало. Чтобы найти совпадение урла пришлось включить LIKE, mysql_real_escape_string() и все равно 100% совпадений нет, а это при базе несколько тысяч урлов дает выпадение около 100 урлов в результате поиска! И добиться хотя бы 99% похоже невозможно.


Bu-Bu

возможно, у тебя вместо & идёт & ? Так иногда бывает.


Bu-Bu

возможно, у тебя вместо & идёт & ? Так иногда бывает.
Да я уж и замены делал и просто под LIKE менял все спецсимволы на _, все равно. Причем каждый раз результат поиска разный. Ближе всего получился LIKE '%".mysql_real_escape_string($url)."%' но это изврат какой-то, потому как раньше искало нормально просто url='$url'. Возможно, при обновлении версий MySQL проблем с CP-1251 будет только добавляться.


Bu-Bu

из консольного клиента эти запросы тоже не работают?


Bu-Bu

проблем с CP-1251 будет только добавляться.
Извините за занудство, но в корректных URL вообще не должно содержаться ничего, что могло бы проявлять различия между cp1251, koi8-r, latin1, или даже базовой ascii.Безусловно, MySQL должен работать и с произвольными строками, для которых это различие присутствует, но, в таком случае, ваше описание проблемы неадекватно, что изрядно затрудняет диагностику проблемы.


Bu-Bu

Ближе всего получился LIKE '%".mysql_real_escape_string($url)."%' но это изврат какой-то, потому как раньше искало нормально просто url='$url'
очень странно, ибо mysql_real_escape_string делает вот что:mysql_real_escape_string() calls MySQL's library function mysql_real_escape_string, which prepends backslashes to the following characters: \x00, \n, \r, \, ', " and \x1a.т.е. добавляет \ перед символами, которых в URL вообще быть не должно


Bu-Bu

Извините за занудство, но в корректных URL вообще не должно содержаться ничего, что могло бы проявлять различия между cp1251, koi8-r, latin1, или даже базовой ascii.Безусловно, MySQL должен работать и с произвольными строками, для которых это различие присутствует, но, в таком случае, ваше описание проблемы неадекватно, что изрядно затрудняет диагностику проблемы.
В том-то и дело, что различия есть, потому как спецсимволы имеют разные коды в UTF-8 и в windows-1251 в котором сделан сайт. Однако принудительная замена тоже не срабатывает. Запросы MySQL пишу уже лет 5, поэтому ошибок в запросе нет, но не работает как надо - хоть что делай. Мало того, что не все находит, но еще сыпет ошибки при записи в базу по найденному id. Т.е. или не находит url, явно присутствующий в базе, или не может записать инфу в базу. В результате приходится в рукопашную править кучу инфы, которая по идее сама должна записаться. Может быть дело в самой таблице? У меня стоит CHAR на поле url и cp1251 на всей таблице. Выход до сих пор не нашел


Bu-Bu

В том-то и дело, что различия есть, потому как спецсимволы имеют разные коды в UTF-8 и в windows-1251 в котором сделан сайт.
Извините, но это бред какой-то. Согласно спецификации RFC1738, URL может содержать только символы US-ASCII из диапазона x20-x7F. UTF-8 по построению совместим с ASCII (RFC2279), и кодировка windows-1251 в указанном диапазоне также полностью совпадает с ASCII.


Bu-Bu

Извините, но это бред какой-то. Согласно спецификации RFC1738, URL может содержать только символы US-ASCII из диапазона x20-x7F. UTF-8 по построению совместим с ASCII (RFC2279), и кодировка windows-1251 в указанном диапазоне также полностью совпадает с ASCII.
Оно вроде бы так, но не возьму в толк, зачем в IE есть опция "Всегда отправлять URL-адреса как UTF-8" ?


Bu-Bu

Оно вроде бы так, но не возьму в толк, зачем в IE есть опция "Всегда отправлять URL-адреса как UTF-8" ?
А это вы у микрософта спросите, им rfc не писан.


Bu-Bu

Извините, но это бред какой-то. Согласно спецификации RFC1738, URL может содержать только символы US-ASCII из диапазона x20-x7F. UTF-8 по построению совместим с ASCII (RFC2279), и кодировка windows-1251 в указанном диапазоне также полностью совпадает с ASCII.
Когда получаешь urlы c HEX-кодами - Вам не приходило в голову почему? Ведь все поисковики держат urlы в базах и большинство из них переводят все символы /:&=*?_- в их HEX-коды. Спрашивается: зачем? Вот и у меня, похоже, подобная проблема. Но возникла она откуда - вот для меня в чем вопрос, если запросы верные, то должен быть 100%-ный результат. Вот я и спрашиваю: как лучше преобразовать url, чтобы он все-таки искался на раз?


Bu-Bu

Когда получаешь urlы c HEX-кодами - Вам не приходило в голову почему?
именно поэтому:
Согласно спецификации RFC1738, URL может содержать только символы US-ASCII из диапазона x20-x7F.
символы за пределами этого диапазона кодируются через символы из этого диапазона
Ведь все поисковики держат urlы в базах и большинство из них переводят все символы /:&=*?_- в их HEX-коды.
откуда вы знаете, как реализовано внутренне представление данных во всех поисковиках?лично я в своем мини-поисковике вообще не храню url целиком, а разбиваю на домен и остальную часть и храню все домены в отдельной таблицето, как url хранятся в поисковиках или где-то еще, не имеет никакого отношения к тому, какие символы там должны бытьвы путаете причину и следствие, поисковики не переводят url в hex коды для хранения, сам url по определнию не должен содержать определнных символов, а если иодержит, то они должны кодироваться в определнном формате через допустимые символы


Bu-Bu

откуда вы знаете, как реализовано внутренне представление данных во всех поисковиках?лично я в своем мини-поисковике вообще не храню url целиком, а разбиваю на домен и остальную часть и храню все домены в отдельной таблицето, как url хранятся в поисковиках или где-то еще, не имеет никакого отношения к тому, какие символы там должны бытьвы путаете причину и следствие, поисковики не переводят url в hex коды для хранения, сам url по определнию не должен содержать определнных символов, а если иодержит, то они должны кодироваться в определнном формате через допустимые символы
Вот например запрос с yahoo.com. http%3a//search.yahoo.com/search%3fp=hendricks%26ei=UTF-8%26pstart=1%26b=11Зачем здесь сделаны преобразования, если символы win и utf соответствуют? Я также сделал те же преобразования и результат поиска стал лучше чем был, но все равно некоторые урлы не находятся. А насчет реализации хранения - хочется сделать именно так, чтобы урл искался целиком, потому как у меня есть поиск урлов, которые могут отличаться на один слеш, например, а мне не нужны повторяющиеся урлы.


Bu-Bu

Вот например запрос с yahoo.com. http%3a//search.yahoo.com/search%3fp=hendricks%26ei=UTF-8%26pstart=1%26b=11
откуда вы взяли эту строку? я на search.yahoo.com такого не нашел
Зачем здесь сделаны преобразования, если символы win и utf соответствуют?
это надо спросить у тех, кто их сделалкод символа ":" например лежит в разрешнном для URL диапазоне символов, преобразовывать его в hex не обязательно, но можноно какое это вообще имеет отношение к вашей проблема?вы хотите сказать, что mysql не ищет записи, если в строке указать ":" вместо "%3a"? бред


Bu-Bu

ИМХО надо бы заставить уже топикстартера привести примеры значения в Мускуле (одного), и запроса (одного), который не находит этого значения в БД.Просто на данный момент все сводится к фразе "гарантий никаких и одинаковые с виду урлы то находятся, то нет". покажите запрос, и значение. Вполне возможно, что вы клажете его в БД со слешами, а ищите без. Или с двумя слешами. Или с завершающим пробелом... или.....


Bu-Bu

ИМХО надо бы заставить уже топикстартера привести примеры значения в Мускуле (одного), и запроса (одного), который не находит этого значения в БД.Просто на данный момент все сводится к фразе "гарантий никаких и одинаковые с виду урлы то находятся, то нет". покажите запрос, и значение. Вполне возможно, что вы клажете его в БД со слешами, а ищите без. Или с двумя слешами. Или с завершающим пробелом... или.....
Запрос MySQL: $q = mysql_query("SELECT id_link,url FROM ".DB_TABLE." WHERE url LIKE '%".$url."%'");пример того, что не находит http://nashli.com/search.php?site=32014&text=slovo. Запись в базу идет с addslashes, но я пробовал и stripslashes в поиск вставлять - результат почти все время один и тот же. trim везде применяется. Я же говорю, что запросы писал и посложнее и они работали а с этими урлами уже пятый день воюю.


Bu-Bu

у меня работает
mysql> insert into zz1 set fstr='http://nashli.com/search.php?site=32014&text=slovo';Query OK, 1 row affected (0.01 sec)mysql> select id,fstr from zz1 where fstr='http://nashli.com/search.php?site=32014&text=slovo';+----+----------------------------------------------------+| id | fstr |+----+----------------------------------------------------+| 25 | http://nashli.com/search.php?site=32014&text=slovo |+----+----------------------------------------------------+1 row in set (0.00 sec)mysql> select id,fstr from zz1 where fstr like '%http://nashli.com/search.php?site=32014&text=slovo%';+----+----------------------------------------------------+| id | fstr |+----+----------------------------------------------------+| 25 | http://nashli.com/search.php?site=32014&text=slovo |+----+----------------------------------------------------+1 row in set (0.00 sec)


Bu-Bu

Если не сложно, ***********, пожалуйста, эту строчку кода:
$q = mysql_query("SELECT id_link,url FROM ".DB_TABLE." WHERE url LIKE '%".$url."%'");
вот так
$q = "SELECT id_link,url FROM ".DB_TABLE." WHERE url LIKE '%".$url."%'";
echo 'Запрос'.$q;
exit;
$q = mysql_query("SELECT id_link,url FROM ".DB_TABLE." WHERE url LIKE '%".$url."%'");
и покажите-какой именно запрос вы отправляете в БД. В переменной $url может быть что угодно )