SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 30.01.2012 13:45:40

nilmam
Участник
Зарегистрирован: 08.12.2011
Сообщений: 3

Проблема с выборкой и экранированием служебных символов

Есть вот такая таблица с данными:

CREATE TABLE IF NOT EXISTS `drv_guid_list` (
  `id_guid` mediumint(6) unsigned NOT NULL AUTO_INCREMENT,
  `id_ven` smallint(6) unsigned NOT NULL DEFAULT '0',
  `id_dev` smallint(6) unsigned NOT NULL DEFAULT '0',
  `drv_guid` char(255) DEFAULT NULL,
  PRIMARY KEY (`id_guid`),
  KEY `drv_guid` (`drv_guid`),
  KEY `id_ven` (`id_ven`,`id_dev`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=85295 ;

--
-- Дамп данных таблицы `drv_guid_list`
--

INSERT INTO `drv_guid_list` (`id_guid`, `id_ven`, `id_dev`, `drv_guid`) VALUES
(1748, 0, 0, 'hdaudio\\func_01&ven_1002&dev_791a'),
(1768, 0, 0, 'hdaudio\\func_01&ven_1002&dev_791a&subsys_00791a00&rev_1000'),
(85291, 0, 0, 'hdaudio\\func_01&ven_1002&dev_791a&rev_1000');


Делаю такую выборку:

mysql> SELECT * FROM `drv_guid_list` WHERE `drv_guid` LIKE '%hdaudio\\func\_01&ven\_1002&dev\_791a%';
Empty set (0.08 sec)
 

ничего не находит..

А вот такая выборка даёт ожидаемый рузльтат:

mysql> SELECT * FROM `drv_guid_list` WHERE `drv_guid` LIKE '%hdaudio\\\\func\_01&ven\_1002&dev\_791a%';
+---------+--------+--------+------------------------------------------------------------+
| id_guid | id_ven | id_dev | drv_guid                                                   |
+---------+--------+--------+------------------------------------------------------------+
|    1748 |      0 |      0 | hdaudio\func_01&ven_1002&dev_791a                          |
|    1768 |      0 |      0 | hdaudio\func_01&ven_1002&dev_791a&subsys_00791a00&rev_1000 |
|   85291 |      0 |      0 | hdaudio\func_01&ven_1002&dev_791a&rev_1000                 |
+---------+--------+--------+------------------------------------------------------------+
3 rows in set (0.08 sec)
 

Вопрос в том, почему символ \ должен экранироваться четырьмя символами \ а не одним?

Неактивен

 

#2 30.01.2012 14:35:00

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Проблема с выборкой и экранированием служебных символов

http://dev.mysql.com/doc/refman/5.5/en/ … rator_like

Because MySQL uses C escape syntax in strings (for example, “\n” to represent a newline character), you must double any “\” that you use in LIKE strings. For example, to search for “\n”, specify it as “\\n”. To search for “\”, specify it as “\\\\”; this is because the backslashes are stripped once by the parser and again when the pattern match is made, leaving a single backslash to be matched against.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson