使用CONCAT时,MySQL REGEXP区分大小写

时间:2017-02-23 17:31:56

标签: mysql

通常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)

这里发生了什么?

2 个答案:

答案 0 :(得分:2)

manual says

  

REGEXP不区分大小写,除非与二进制字符串一起使用。

所以你的一个CONCAT字符串是二进制的。

因此,如果它适用于您的name列,则表示该列是标准字符串(_ci),但随后附加了我假设的id是一个数值,这是一个二进制列,因此使REGEXP区分大小写。

<强>解决方案:

  

但在实际情况下,我正在查询char和int。

CAST您的数字列为不区分大小写的字符串:

 SELECT count(*) FROM data_tool WHERE 
 concat_ws('.',name,CAST(id AS CHAR)) REGEXP 'cd';

可能还需要仔细检查您的默认表Collat​​ion是否以_ci结尾,表明默认字符串列值不区分大小写。
请注意,您无法 Int 转换为 Varchar 类型。

我希望有所帮助。

如果没有,请编辑您的问题并输出您的表格结构详情(SHOW CREATE TABLE),以便我们了解它是如何制作的。干杯

答案 1 :(得分:1)

也许您在utf8_general_ci列中使用name(不区分大小写)排序规则。因此,当您使用id列(数字?)进行连接时,它会隐式转换为区分大小写的排序规则,例如utf8_bin

name和id列的排序规则是什么?