MariaDB:为什么LOCATE使用区分大小写的比较?

时间:2018-11-14 04:14:34

标签: sql mariadb

我有一个数据库,该数据库的“名称”列中包含以下数据:

enter image description here

但是,运行以下查询将返回错误的结果:

SELECT `e`.`Id`, `e`.`Name`
      FROM `Regions` AS `e`
      WHERE (LOCATE('s', `e`.`Name`) > 0)

返回:

Calgary Northeast
Test Location
Calgary West

但是,它不返回开头为s的“ BC省南部”。根据MariaDB文档,LOCATE函数不区分大小写(请参阅:https://mariadb.com/kb/en/library/locate/),因此我希望结果中显示“ Southern BC”和“ Calgary South”。很明显,我的查询正在执行区分大小写的比较,但是我不知道为什么。在我检查过的所有地方,我所有的归类都设置为utf8mb4_general_ci

SELECT TABLE_SCHEMA
    , TABLE_NAME
    , TABLE_COLLATION
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME ='Regions';

返回utf8mb4_general_ci

SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

返回

collation_connection    utf8mb4_general_ci
collation_database  utf8mb4_general_ci
collation_server    utf8mb4_general_ci

我正在运行10.3.10-MariaDB-1:10.3.10+maria~bionic-log

对此行为有任何想法吗?

3 个答案:

答案 0 :(得分:0)

您可以选择

SELECT `e`.`Id`, `e`.`Name`
      FROM `Regions` AS `e`
      WHERE (LOCATE('s', `e`.`Name`) > 0) OR (LOCATE('S', `e`.`Name`) > 0)

OR

SELECT `e`.`Id`, `e`.`Name`
          FROM `Regions` AS `e`
          WHERE e.name like '%S%' or e.name like '%s%'

答案 1 :(得分:0)

我无法重现该问题:

MariaDB [_]> SELECT VERSION();
+-----------------+
| VERSION()       |
+-----------------+
| 10.3.10-MariaDB |
+-----------------+
1 row in set (0.000 sec)

MariaDB [_]> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.002 sec)

MariaDB [_]> SHOW VARIABLES LIKE 'collation%';
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database   | utf8mb4_general_ci |
| collation_server     | utf8mb4_general_ci |
+----------------------+--------------------+
3 rows in set (0.001 sec)

MariaDB [_]> DROP TABLE IF EXISTS `Regions`;
Query OK, 0 rows affected (0.005 sec)

MariaDB [_]> CREATE TABLE IF NOT EXISTS `Regions` (
    ->   `Name` VARCHAR(255)
    -> );
Query OK, 0 rows affected (0.010 sec)

MariaDB [_]> INSERT INTO `Regions`
    -> VALUES
    ->   ('Calgary South'),
    ->   ('Calgary Northeast'),
    ->   ('Calgary Location'),
    ->   ('Location'),
    ->   ('Calgary West'),
    ->   ('Calgary BC'),
    ->   ('Southern BC');
Query OK, 7 rows affected (0.004 sec)
Records: 7  Duplicates: 0  Warnings: 0

MariaDB [_]> SELECT `Name`
    -> FROM `Regions`;
+-------------------+
| Name              |
+-------------------+
| Calgary South     |
| Calgary Northeast |
| Calgary Location  |
| Location          |
| Calgary West      |
| Calgary BC        |
| Southern BC       |
+-------------------+
7 rows in set (0.000 sec)

MariaDB [_]> SELECT `Name`
    -> FROM `Regions`
    -> WHERE LOCATE('s', `Name`) > 0;
+-------------------+
| Name              |
+-------------------+
| Calgary South     |
| Calgary Northeast |
| Calgary West      |
| Southern BC       |
+-------------------+
4 rows in set (0.001 sec)

答案 2 :(得分:0)

请提供SHOW CREATE TABLEname的排序规则很重要。

如果您使用默认排序规则或其他..._ci排序规则,那么这是合适的:

WHERE e.name LIKE '%s%'

捕获大写和小写s

LIKEREGEXP适用于检查子字符串。 LOCATE适合查找字符串中某物的位置。