MySQL如何实现区分大小写的字符串匹配与列值拆分?
当然可以实现这个区分大小写的查找需求!MySQL里的字符串匹配是否区分大小写,核心取决于字符集的排序规则,以及你选择的查询方式。下面给你两种直接可行的方案:
方案1:使用COLLATE指定区分大小写的排序规则
MySQL中,以_ci结尾的排序规则(比如默认的utf8mb4_general_ci)是不区分大小写的,而以_bin结尾的二进制排序规则会严格区分字符的大小写(因为它直接比较字符的二进制值)。
你可以在查询时给LOCATE函数的匹配目标指定二进制排序规则,修改你的查询片段如下:
SELECT SUBSTRING_INDEX(description, 'Ingredients', 1), IF(LOCATE('Ingredients', description COLLATE utf8mb4_bin) > 0, SUBSTRING_INDEX(SUBSTRING_INDEX(description, 'Ingredients', -1), '...', 1), '') AS extracted_ingredients_part FROM your_table_name;
这样,只有当description中存在精确的Ingredients(首字母大写)时,LOCATE才会返回大于0的位置;如果是小写的ingredients,结果会是0,完全符合你的要求。
方案2:使用BINARY操作符强制二进制比较
另一种简单的方式是用BINARY关键字把匹配字符串转成二进制格式,这样比较时会严格区分大小写:
SELECT SUBSTRING_INDEX(description, 'Ingredients', 1), IF(LOCATE(BINARY 'Ingredients', description) > 0, SUBSTRING_INDEX(SUBSTRING_INDEX(description, 'Ingredients', -1), '...', 1), '') AS extracted_ingredients_part FROM your_table_name;
同样,这个写法会让LOCATE只匹配大小写完全一致的Ingredients。
进阶:设置字段默认区分大小写
如果你的业务长期需要对description字段做区分大小写的查询,可以在建表时直接指定字段的排序规则为二进制类型,这样后续查询就不用每次额外指定规则了:
CREATE TABLE your_table_name ( id INT AUTO_INCREMENT PRIMARY KEY, description VARCHAR(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin );
举个验证例子:对于字符串'Oil is a product Ingredients are',执行SELECT LOCATE('Ingredients', description COLLATE utf8mb4_bin)会返回匹配的位置,而SELECT LOCATE('ingredients', description COLLATE utf8mb4_bin)会返回0,完美满足你的区分大小写需求。
内容的提问来源于stack exchange,提问作者Rand

