MySQL搜索逗号分隔值语法
我正在使用MySQL。在我的一个表属性中,我有一个序列号描述,比如一个设备的SM、ST、SK 当用户输入SM、ST或SK时,我希望我的查询返回一个结果 我当前的查询如下所示: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
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 | +-------------------------------+