mysql CONCAT 不断转义

标签 mysql

我正在尝试编写一个过程,但在我的 @qr2 中,当我传递 substring_index() 的参数时,CONCAT 被转义。

知道如何将 '-' 传递到函数中,而不让它转义 CONCAT 函数吗?

我尝试过使用“'-'”或\'-\',但没有任何效果,它一直在转义。

DELIMITER //
CREATE PROCEDURE filter_bar (IN bar_state VARCHAR(20), done_state VARCHAR(20))
BEGIN
set @qr1 = CONCAT('CREATE TABLE ', done_state, ' like ', bar_state, ';');
PREPARE smt from @qr1;
EXECUTE smt;
DEALLOCATE smt;

set @qr2 = CONCAT('UPDATE ', bar_state, ' SET date = SUBSTRING_INDEX(date,'-',-1);');
PREPARE smt from @qr2;
EXECUTE smt;
DEALLOCATE smt;

set @qr3 = CONCAT('INSERT into', done_state,'select name, business_id, date, sum(count) as count from', bar_state,' group by name, business_id, date;');
PREPARE smt from @qr3;
EXECUTE smt;
END //

最佳答案

您可以使用'':

set @qr2=CONCAT('UPDATE ',bar_state,' SET date=SUBSTRING_INDEX(date,''-'',-1);');

您还需要一个空间:

set @qr3 = CONCAT('INSERT into', done_state,' select name, business_id, date, ...'
                                             -- here

最后:

DEALLOCATE smt;
=> 
DEALLOCATE PREPARE smt;

<强> DBFiddle Demo

<小时/>

编辑:

为了避免 SQL 注入(inject)问题,您应该用引号将每个出现的标识符括起来:

The quote_identifier() Function

Given a string argument, this function produces a quoted identifier suitable for inclusion in SQL statements. This is useful when a value to be used as an identifier is a reserved word or contains backtick (`) characters.

bar_state
=>
sys.quote_identifier(bar_state)

done_state
=>
sys.quote_identifier(done_state)

关于mysql CONCAT 不断转义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52238158/

相关文章:

python - Sqlalchemy远程数据库 session 刷新/刷新问题

mysql - 如何删除这个文件排序?

mysql - mySQL 查询中的错误#1064

mysql - 尝试将 DateTimePicker 中的值插入数据库,但导致日期时间格式无效

php - MySql 重叠日期无法正确显示

php - 无论表中的记录数如何,为每一列检索一条记录

php - 如何使用 laravel framework 5.1 连接到 3308 端口的 MySQL 数据库?

mysql - 我该如何编写左连接子句

php - SQL没有标识符,只有时间戳

php - 通过连接从两个表中选择数据