通常REGEXP不区分大小写,例如:
mysql> select count(*) from data_tool where name regexp 'CD';
+----------+
| count(*) |
+----------+
| 22 |
+----------+
1 row in set (0.00 sec)
mysql> select count(*) from data_tool where name regexp 'cd';
+----------+
| count(*) |
+----------+
| 22 |
+----------+
1 row in set (0.00 sec)
但似乎当我在concat中使用它时会变得区分大小写,例如:
mysql> select count(*) from data_tool where concat_ws('.',name,id) regexp 'cd';
+----------+
| count(*) |
+----------+
| 0 |
+----------+
1 row in set (0.00 sec)
mysql> select count(*) from data_tool where concat_ws('.',name,id) regexp 'CD';
+----------+
| count(*) |
+----------+
| 22 |
+----------+
1 row in set (0.00 sec)
这里发生了什么?
答案 0 :(得分:2)
REGEXP不区分大小写,除非与二进制字符串一起使用。
所以你的一个CONCAT字符串是二进制的。
因此,如果它适用于您的name
列,则表示该列是标准字符串(_ci
),但随后附加了我假设的id
列是一个数值,这是一个二进制列,因此使REGEXP区分大小写。
<强>解决方案:强>
但在实际情况下,我正在查询char和int。
CAST您的数字列为不区分大小写的字符串:
SELECT count(*) FROM data_tool WHERE
concat_ws('.',name,CAST(id AS CHAR)) REGEXP 'cd';
您可能还需要仔细检查您的默认表Collation是否以 _ci
结尾,表明默认字符串列值不区分大小写。
请注意,您无法将 Int 转换为 Varchar 类型。
我希望有所帮助。
如果没有,请编辑您的问题并输出您的表格结构详情(SHOW CREATE TABLE
),以便我们了解它是如何制作的。干杯
答案 1 :(得分:1)
也许您在utf8_general_ci
列中使用name
(不区分大小写)排序规则。因此,当您使用id
列(数字?)进行连接时,它会隐式转换为区分大小写的排序规则,例如utf8_bin
。
name和id列的排序规则是什么?