LINUX.ORG.RU

не правильная обработка запроса в MySQL


0

0

Есть запрос: select * from time_type where name like "%ср%";
Но вместо того чтобы выдать только те данные где в слове содержится ср он выдает и не совпадающие, например:
Стандартно
СРОЧНО
Как можно заставить выводить строгое совпадение через like?
anonymous

С кодировкой сравнения всё ок?

r_asian ★☆☆
()

> select * from time_type where name like "%ср%";

> Но вместо того чтобы выдать только те данные где в слове содержится ср он выдает и не совпадающие, например:

> СРОЧНО

Это потому что сравнение без учета регистра.

> Стандартно

А вот это не объяснить.. точно такая запись выдается???

gods-little-toy ★★★
()
Ответ на: комментарий от m1rag3

>А разве like без учета регистра сравнивает? Мой склероз меня подводит что-то в последнее время.

The following two statements illustrate that string comparisons are not case sensitive unless one of the operands is a binary string:

mysql> SELECT 'abc' LIKE 'ABC';
-> 1
mysql> SELECT 'abc' LIKE BINARY 'ABC';
-> 0

Tigger ★★★★★
()
Ответ на: комментарий от gods-little-toy

то что без учета регистра это меня не смущает, а вот то что не подходящие варианты выдает, вот это уже странно... точный вывод такой:

mysql> select * from time_type where name like "%ср%";
+----+------------+
| id | name       |
+----+------------+
|  2 | Стандартно |
|  3 | СРОЧНО     |
+----+------------+
2 rows in set (0.02 sec)

mysql>

anonymous
()
Ответ на: комментарий от anonymous

mysql> select * from time_type where name like "%ср%";
+----+------------+
| id | name       |
+----+------------+
|  2 | Стандартно |
|  3 | СРОЧНО     |
+----+------------+
2 rows in set (0.02 sec)


Если я чего-то не упускаю, это выглядит как неправильный результат запроса. С другой стороны берет сомнение - такие запросы у кучи народа и открытых багов  Не можете попробовать следующее: 


CREATE TABLE test LIKE time_type;
INSERT INTO test SELECT * FROM time_type WHERE name LIKE "%ср%";
SELECT * FROM time_type where name like "%ср%";


если последний запрос выдает обе записи, заведите баг на 
http://bugs.mysql.com/. Пожалуйста впишите туда
- Вывод SHOW CREATE TABLE test, SELECT * FROM test;
- версию MySQL

если запрос к таблице test выдает только одну запись.. тогда отпишите сюда, подумаем что можно сделать. Много ли в таблице записей? 

Заранее спасибо
Sergey Petrunia, Software developer, MySQL AB.

anonymous
()
Ответ на: комментарий от anonymous

mysql> select * from time_type where name like "%ср%";
+----+------------+
| id | name       |
+----+------------+
|  2 | Стандартно |
|  3 | СРОЧНО     |
+----+------------+
2 rows in set (0.02 sec)


Если я чего-то не упускаю, это выглядит как неправильный результат
запроса. С другой стороны берет сомнение - такие запросы у кучи
народа и открытых багов на это нет. Не можете попробовать следующее: 


CREATE TABLE test LIKE time_type;
INSERT INTO test SELECT * FROM time_type WHERE name LIKE "%ср%";
SELECT * FROM time_type where name like "%ср%";


если последний запрос выдает обе записи, заведите баг на 
http://bugs.mysql.com/. Пожалуйста впишите туда
- Вывод SHOW CREATE TABLE test, SELECT * FROM test;
- версию MySQL

если запрос к таблице test выдает только одну запись.. тогда 
отпишите сюда, подумаем что можно сделать. Много ли в таблице
записей? 

Заранее спасибо
Sergey Petrunia, Software developer, MySQL AB.

anonymous
()
Ответ на: комментарий от anonymous

Как и прежде выдает две записи, проверял на разных платформах и версиях. Пытаюсь написать багрепорт но что то не понятно как ее правильно составить :(

anonymous
()
Ответ на: комментарий от r_asian

mysql> show create table time_type;
+-----------+--------------------------------------------
| Table     | Create Table                               
+-----------+--------------------------------------------
| time_type | CREATE TABLE `time_type` (
  `id` tinyint(4) NOT NULL auto_increment,
  `name` varchar(12) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 |
+-----------+--------------------------------------------

anonymous
()
Ответ на: комментарий от anonymous

) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 |

> Как и прежде выдает две записи, проверял на разных платформах и
> версиях. Пытаюсь написать багрепорт но что то не понятно как ее
> правильно составить :(

Очень просто - заголовок что-то вроде incorrect query result with LIKE.

Содержимое: 
 * вывод SHOW CREATE TABLE 
 * вывод SELECT * FROM t1; (ну если INSERT'ы будут вообще идеально будет) 
 * сам select и его результат (то что сюда постили)
 * вывод SHOW VARIABLES LIKE '%collation%', на всякий случай
 * версию на которой пробовали.

Вообще немного смущает что у вас у таблицы указано CHARSET=latin1. Лучше бы что-то русское, вроде cp1251. Но для такого запроса, насколько я знаю, должно работать и в latin1. 

Sergey Petrunia, Software developer, MySQL AB.

anonymous
()
Ответ на: комментарий от anonymous

Ради интереса провверил у себя (5.0.32) - работает как надо, ничего лишнего не выдает.

gruy ★★★★★
()
Ответ на: комментарий от anonymous

Есть предположение, на грани фантазии, что из за latin1 у человека запрос по какой-то причине получается не "like '%pc%'", а "like '%??%'".

А дальше уже дело техники :-)

r_asian ★☆☆
()
Ответ на: комментарий от anonymous

Спасибо. Багрепорт отправил. Но там можно указать только один тип системы или все, я пробовал на Fedora 8 и FreeBSD 5.4, думаю не обязательно будет повторять запись для FreeBSD.

anonymous
()
Ответ на: комментарий от r_asian

Врядли это "like '%??%'", так как такой запрос выдает что надо: mysql> SELECT * FROM test WHERE name LIKE "%сроч%"; +----+--------+ | id | name | +----+--------+ | 5 | СРОЧНО | +----+--------+ 1 row in set (0.00 sec)

anonymous
()
Ответ на: комментарий от anonymous

Врядли это "like '%??%'", так как такой запрос выдает что надо: 

mysql> SELECT * FROM test WHERE name LIKE "%сроч%";
+----+--------+
| id | name   |
+----+--------+
|  5 | СРОЧНО |
+----+--------+
1 row in set (0.00 sec)

anonymous
()
Ответ на: комментарий от anonymous

Как с latin1 удалось вообще кириллицу вставить в таблицу? У меня при том create table, что приведён выше, вообще вместо кириллицы в таблицу вставляется чёрти что.

Tigger ★★★★★
()
Ответ на: комментарий от anonymous

OMG!!!

При таком трюкачестве, ты ещё хочешь, чтобы всё как надо работало :-)))

А как же default charset='koi8-r', а потом, как полагается: "SET NAMES 'koi8-r'"? Или это слишком просто? :-)

r_asian ★☆☆
()
Ответ на: комментарий от r_asian

А в чем собственно проблема? При latin1 данные обрабатываются по кодам символов. Это дает возможность использовать различные кодировки в таблицах. Так что все должно работать правильно.

anonymous
()
Ответ на: комментарий от anonymous

>А в чем собственно проблема? При latin1 данные обрабатываются по кодам символов. Это дает возможность использовать различные кодировки в таблицах. Так что все должно работать правильно.

А без извращений использовать utf-8 не проще? Не знаю как и что у тебя обрабатывается, но у меня даже простой insert не позволяет внести кириллицу при попытке впихнуть что-либо в таблицу с latin-1.

mysql> insert into time_type (name) values ('Стандартно');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> insert into time_type (name) values ('СРОЧНО');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * from time_type;
+----+------------+
| id | name |
+----+------------+
| 5 | ?????????? |
| 6 | ?????? |
+----+------------+
2 rows in set (0.00 sec)

Может расскажешь как тебе удалось это сделать?

Tigger ★★★★★
()
Ответ на: комментарий от Tigger

для начала должно быть:
| character_set_client            | latin1                                          
| character_set_connection        | latin1                                                  
| character_set_database          | latin1                                                  
| character_set_filesystem        | binary                                                  
| character_set_results           | latin1                                                  
| character_set_server            | latin1                                                  
| character_set_system            | utf8                                                    
| character_sets_dir              | /usr/share/mysql/charsets/                              
| collation_connection            | latin1_swedish_ci                                       
| collation_database              | latin1_swedish_ci                                       
| collation_server                | latin1_swedish_ci

после этого нужно создать таблицу:
mysql> CREATE TABLE test (id tinyint not null auto_increment, name varchar(12) default '' not null, primary key (id)) ENGINE=MyISAM DEFAULT CHARSET=latin1;

и убедиться что терминал отображает в koi8-r
После этого можно наполнять данными.

Или берем свеже установленную систему, настройки для MySQL поумолчанию, в konsole выбираем кодировку koi8-r и просто создаем таблицу:
mysql> CREATE TABLE test (id tinyint not null auto_increment, name varchar(12) default '' not null, primary key (id));

Данные будут заноситься в той кодировке какая выбрана в konsole.

anonymous
()
Ответ на: комментарий от anonymous

Да, некоторые знают толк в извращениях %)

А если без извращений сделать таблицу koi8r и установить names в koi8r, то всё работает без проблем, в т.ч. и выборки. Но, наверное, кому-то это слишком скучно.

Tigger ★★★★★
()
Ответ на: комментарий от anonymous

УЖС!!!

Впрочем, что-то мне подсказывает:

> ...терминал отображает в koi8-r.

что мсье - БСД-шник, либо матёрый некрофил. Тут можно что угодно ожидать.

r_asian ★☆☆
()
Ответ на: комментарий от Tigger

Если поставить везде koi8r то работает нормально. Только возникает вопрос, можно ли при таких настройках использовать в таблицах и koi8r и cp1251?

anonymous
()
Ответ на: комментарий от anonymous

>Если поставить везде koi8r то работает нормально. Только возникает вопрос, можно ли при таких настройках использовать в таблицах и koi8r и cp1251?

А зачем? Все данные надо хранить в одной кодировке, иначе ни одна сортировка нормально работать не будет. Если данные вносятся с сайта в cp1251, так бывают функции, конвертирующие эти данные на лету. В php такое точно есть.

Tigger ★★★★★
()
Ответ на: комментарий от Tigger

понимаешь, если ты ищешь подстроку, мускуль уже должен преобразовать все заданные поля в строки и в них искать

temy4
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.