【问题标题】:MySQL FIND_IN_SET function with special character not working具有特殊字符的 MySQL FIND_IN_SET 函数不起作用
【发布时间】:2019-07-12 13:58:33
【问题描述】:

我有一个存储过程:

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_한글 标签。

值 ~!@#$%^&*()_+|}{":?><.>

这是数据库中的数据:

和 MySQL 版本:

SELECT VERSION();

10.3.9-MariaDB

【问题讨论】:

  • 我用mysql,我也标记mssql来帮忙
  • 它没有帮助 - 它是一种完全不同的技术
  • 请提供一个有效的测试用例。

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


【解决方案1】:

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

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 函数匹配正确的值

【讨论】:

  • 为什么要禁用此设置?为什么不把所有的`\`都换成`\\`呢?
  • 是的,我们可以使用 \\ 代替设置 NO_BACKSLASH_ESCAPES 模式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-23
相关资源
最近更新 更多