具有特殊字符的MySQL FIND_IN_SET函数不起作用

时间:2019-02-19 06:16:35

标签: mysql sql mariadb find-in-set mariasql

我有一个存储过程:

CREATE PROCEDURE MyDB.`tag_quicktrend`(
    IN taglist TEXT
)
BEGIN
    SELECT *
    FROM taginfo
    WHERE FIND_IN_SET(tagname,taglist);
END;

当我致电SP时: call sp_chart_band_tag_quicktrend('YH05_한글')返回正确的标签。 call sp_chart_band_tag_quicktrend('YH05_한글,~!@#$%^&*()_+|}{":?><./'';[]\\=-')`

但它仅返回YH05_한글标签。

〜!@#$%^&*()_ + |} {“:?> <./''; [] \ =-`的值是数据库中的标记名。

enter image description here

这是数据库中的数据:

enter image description here

以及MySQL版本:

SELECT VERSION();

10.3.9-MariaDB

1 个答案:

答案 0 :(得分:0)

最后我发现了问题,因为我设置了此模式。

SET @@SQL_MODE = CONCAT(@@SQL_MODE, ',NO_BACKSLASH_ESCAPES');

此等于(=)查询返回空

select * from taginfo where tagname = '~!@#$%^&*()_+|}{":?><./'';[]\\=-`'

当我通过SET @@SQL_MODE = 'NO_ENGINE_SUBSTITUTION';删除NO_BACKSLASH_ESCAPES时

select * from taginfo where tagname = '~!@#$%^&*()_+|}{":?><./'';[]\\=-`'

它返回带有标签名=〜!@#$%^&*()_ + |} {“:?> <./'; [] \ =-`

的行

使FIND_IN_SET函数匹配正确的值