MySQL搜索逗号分隔值语法

MySQL搜索逗号分隔值语法,mysql,conditional-statements,Mysql,Conditional Statements,我正在使用MySQL。在我的一个表属性中,我有一个序列号描述,比如一个设备的SM、ST、SK 当用户输入SM、ST或SK时,我希望我的查询返回一个结果 我当前的查询如下所示: SELECT CONCAT(lvl1_id,',',lvl2_id) FROM hier_menus LEFT JOIN labels ON (hier_menus.id=label_id AND tbl=65 AND fld=2 AND lang_id=5) WHERE hm_type=13 AND lvl1_id=14

我正在使用MySQL。在我的一个表属性中,我有一个序列号描述,比如一个设备的SM、ST、SK

当用户输入SM、ST或SK时,我希望我的查询返回一个结果

我当前的查询如下所示:

SELECT CONCAT(lvl1_id,',',lvl2_id)
FROM hier_menus
LEFT JOIN labels ON (hier_menus.id=label_id AND tbl=65 AND fld=2 AND lang_id=5)
WHERE
hm_type=13 AND lvl1_id=141 AND lvl2_id=id AND label='".addslashes($serial)."'";
它只能查看序列号列的第一个逗号部分。当用户进入ST时,它不会返回任何内容

是否可以搜索整个长字符串SM、ST、SK以返回匹配行

试试看:

正如ajreal所指出的,不要使用addslashes。使用mysql\u real\u escape\u字符串或DB抽象库提供的任何内容。addslashes已无望地被破坏,将允许有人轻松地攻击您的数据库

mysql> select find_in_set('SK', 'SM,ST,SK'); +-------------------------------+ | find_in_set('SK', 'SM,ST,SK') | +-------------------------------+ | 3 | +-------------------------------+ 1 row in set (0.00 sec) mysql> select find_in_set('SP', 'SM,ST,SK'); +-------------------------------+ | find_in_set('SP', 'SM,ST,SK') | +-------------------------------+ | 0 | +-------------------------------+ 您正在查找集合中的查找, 但是,这不是一个优化解决方案

您应该将序列号规范化到另一个表中, 其中,每个SM、ST和SK存储为一行


另一种方法是将数据类型转换为

addslashes不能确保正确转义用户输入数据使用find_in_set是解决此问题的好方法,但建议对数据库进行规范化,以提高可用性、可扩展性和性能。 mysql> select find_in_set('SK', 'SM,ST,SK'); +-------------------------------+ | find_in_set('SK', 'SM,ST,SK') | +-------------------------------+ | 3 | +-------------------------------+ 1 row in set (0.00 sec) mysql> select find_in_set('SP', 'SM,ST,SK'); +-------------------------------+ | find_in_set('SP', 'SM,ST,SK') | +-------------------------------+ | 0 | +-------------------------------+