mysql - 处理 mysql sp 中的单引号和双引号

标签 mysql stored-procedures

我有以下存储过程

DELIMITER $$

USE `database_name`$$

DROP FUNCTION IF EXISTS `get_data`$$

CREATE DEFINER=`database_name`@`%` FUNCTION `get_data`(
                    v_search_text TEXT
) RETURNS TEXT CHARSET utf8
    DETERMINISTIC
BEGIN

    DECLARE v_select TEXT DEFAULT 'SELECT ';
    DECLARE v_from TEXT DEFAULT ' FROM ';
    DECLARE v_order,v_group TEXT DEFAULT '';
    DECLARE v_where TEXT DEFAULT ' WHERE 1 = 1 ';
    DECLARE v_return_string TEXT DEFAULT '';

    SET v_select = CONCAT(v_select,"id, title, detail", v_from, "table");

    IF(IFNULL(v_search_text,'') != '' ) THEN
        SET v_search_text = QUOTE(v_search_text);
        SET v_where = CONCAT(v_where," AND (title like '%",v_search_text,"%' or detail like '%",v_search_text,"%' )");
    END IF;

    -- other stuff like order, pagination etc.
    SET v_return_string = CONCAT(
            v_select,
            v_from,
            v_where
        );

    PREPARE v_return_string FROM @count_query;
    EXECUTE v_return_string;
END$$

DELIMITER ;

现在的问题是让我们假设,我有如下表中的数据

id---标题---详细信息
1-----A'a---- 详情
2-----B"b----详细信息"b

现在,如果我调用上面的 SP 并将搜索参数传递为 ' 那么它将中断:

call get_data('\''); -- means search the data which has single quote in it

要解决这个问题,我可以更改如下所示的一行

SET v_where = CONCAT(v_where," AND (title like '%",v_search_text,"%' or detail like '%",v_search_text,"%' )");

SET v_where = CONCAT(v_where,' AND (title like "%',v_search_text,'%" or detail like "%',v_search_text,'%" )');

然后它将适用于单引号,但它将中断双引号。那么有没有办法解决这两种情况呢?

最佳答案

我更改了以下行:

SET v_where = CONCAT(v_where," AND (title like '%",v_search_text,"%' or detail like '%",v_search_text,"%' )");

如下:

SET v_search_text = QUOTE(CONCAT('%',v_search_text,'%'));
SET v_where = CONCAT(v_where," AND (title like ",v_search_text," or detail like ",v_search_text," )");

问题已解决。

关于mysql - 处理 mysql sp 中的单引号和双引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52593168/

相关文章:

PHP:同一帖子 ID 仅输出一次并添加该帖子的媒体

php - 如何从数据库中获取最新的10条记录

c# - 从 WPF 执行存储过程

mysql - 将关键数据存储到 MySQL 数据库中

php - 如何在网络应用程序中显示和操作视觉对象?

php - 如何处理大型(每天超过 100 万行)mySQL 数据库和事务

c# - 当查询用作表达式时包含多个值

oracle - 如何将 Oracle 过程的参数默认值设置为选择结果?

php - 命令不同步;在 Mysql 中调用存储过程时,您现在无法运行此命令

mysql - 如何获取mysql中两个表中列之间的匹配计数