SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 04.12.2007 12:23:44

Golova
Завсегдатай
Зарегистрирован: 23.03.2007
Сообщений: 92

функция для escape символов в MySQL

в MySQL API есть такая функции как  mysql_escape_string(),mysql_real_escape_string(), но когда нужно сделать тоже самое в хранимых процедурах возникает проблема. Есть ли в самом языке что то похожее или нужно писать свою функцию для этого ?

Неактивен

 

#2 04.12.2007 14:04:11

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: функция для escape символов в MySQL

В самом языке нету, т.к. это лишено смысла - Вы передаете строку внутрь
MySQL уже в нужном виде. Внутри процедуры строка уже внутри MySQL =>
передавать ее туда не надо ни в каком виде.

Неактивен

 

#3 04.12.2007 15:27:58

Golova
Завсегдатай
Зарегистрирован: 23.03.2007
Сообщений: 92

Re: функция для escape символов в MySQL

НУ давайте разберем на примере:

DROP DATABASE IF EXISTS tst;
CREATE DATABASE tst;
USE tst;

DROP TABLE IF EXISTS tst;
CREATE TABLE tst(
  id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
  tst_name varchar(64) NOT NULL DEFAULT ''
);

тестовая процедура:

DELIMITER $$

DROP PROCEDURE IF EXISTS `atswitch`.`sp_tst`$$

CREATE PROCEDURE `tst`.`sp_tst`(
IN in_name varchar(64),
OUT out_err_desc varchar(1024)
)
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION SET out_err_desc = CONCAT(out_err_desc, ' SQLEXCEPTION occured.');

SET out_err_desc = CONCAT('Insert into tst failed (', in_name, ').');
INSERT INTO tst SET tst_name=in_name;
SET out_err_desc='success'.
END$$

DELIMITER ;

тестовый запрос:

call sp_tst('test\'name', @err_dsc);
SELECT @err_dsc

попробуйте все это выполнить и скажите мне что получилось.

Отредактированно Golova (04.12.2007 17:27:02)

Неактивен

 

#4 04.12.2007 15:33:16

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: функция для escape символов в MySQL

Код:

+-------------------------------------+
| @err_dsc                            |
+-------------------------------------+
| Insert into tst failed (test'name). | 
+-------------------------------------+
1 row in set (0.00 sec)

> select * from tst;
+----+-----------+
| id | tst_name  |
+----+-----------+
|  1 | test'name | 
+----+-----------+
1 row in set (0.02 sec)

Отредактированно paulus (04.12.2007 15:36:06)

Неактивен

 

#5 04.12.2007 15:56:16

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: функция для escape символов в MySQL

Наверное, такая функция могла бы понадобиться в другой ситуации, при попытке неправильного использования PREPARE.

Неактивен

 

#6 04.12.2007 16:01:51

Golova
Завсегдатай
Зарегистрирован: 23.03.2007
Сообщений: 92

Re: функция для escape символов в MySQL

rgbeast написал:

Наверное, такая функция могла бы понадобиться в другой ситуации, при попытке неправильного использования PREPARE.

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

В самом языке нету, т.к. это лишено смысла - Вы передаете строку внутрь
MySQL уже в нужном виде. Внутри процедуры строка уже внутри MySQL =>
передавать ее туда не надо ни в каком виде.
.

недействительным ?

Неактивен

 

#7 04.12.2007 16:10:16

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: функция для escape символов в MySQL

Даже в случае PREPARE, как мне думается, это бессмысленно. Попробуйте придумать
пример, где это нужно?

Неактивен

 

#8 04.12.2007 16:10:44

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: функция для escape символов в MySQL

Обычный запрос проходит, как указал paulus. А PREPARE надо использовать правильно, то есть передавать переменные в нее при выполнении EXECUTE

Неактивен

 

#9 04.12.2007 16:17:28

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: функция для escape символов в MySQL

В PREPARE ты все равно будешь делать CONCAT со строками, которые пришли снаружи
(т.е. через addslashes) или из базы (но все равно как законченные строки). У тебя никогда
не возникнет необходимости в такой функции внутри процедуры.

Убедить меня в обратном можно примером... но я думаю, что такого примера нету.

Неактивен

 

#10 04.12.2007 16:28:30

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: функция для escape символов в MySQL

Вот пример неправильного использования PREPARE, при котором функция требуется

mysql> create table g (g varchar(100));
Query OK, 0 rows affected (0.00 sec)

mysql> insert into g values ('horse');
Query OK, 1 row affected (0.00 sec)

mysql> DELIMITER //
mysql> create procedure gg (s VARCHAR(100)) BEGIN
SET @s1:=CONCAT('UPDATE g SET g=\'',s,'\'');
PREPARE gstat FROM @s1; EXECUTE gstat;
END //
Query OK, 0 rows affected (1.66 sec)

mysql> DELIMITER ;

mysql> set @a='kon\'';
Query OK, 0 rows affected (0.01 sec)

mysql> call gg(@a);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''kon''' at line 1

Неактивен

 

#11 04.12.2007 16:48:27

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: функция для escape символов в MySQL

Да, согласен, был не прав smile

Неактивен

 

#12 04.12.2007 17:25:29

Golova
Завсегдатай
Зарегистрирован: 23.03.2007
Сообщений: 92

Re: функция для escape символов в MySQL

Согласен что приведенный мною пример корявый, но вот rgbeast привел правильный пример.

Отредактированно Golova (04.12.2007 17:28:14)

Неактивен

 

#13 04.12.2007 17:33:37

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: функция для escape символов в MySQL

Требуемую функции несложно реализовать, используя функцию REPLACE.
REPLACE( REPLACE(@a, '\\', '\\\\'), '\'', '\\\'');

Неактивен

 

#14 04.12.2007 18:26:28

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: функция для escape символов в MySQL

Лучше уж тогда хранимой функцией в базе mysql smile
И менять надо 4 символа - две кавычки, бэкслеш и #0.

Неактивен

 

#15 04.12.2007 19:14:29

Golova
Завсегдатай
Зарегистрирован: 23.03.2007
Сообщений: 92

Re: функция для escape символов в MySQL

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

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_quote
QUOTE(str)

Quotes a string to produce a result that can be used as a properly escaped data value in an SQL statement. The string is returned enclosed by single quotes and with each instance of single quote (“'”), backslash (“\”), ASCII NUL, and Control-Z preceded by a backslash. If the argument is NULL, the return value is the word “NULL” without enclosing single quotes.

помню что точно искал её и усиленно но попалась только сейчас - зараза smile

Неактивен

 

Board footer

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