我有一个数据库,该数据库的“名称”列中包含以下数据:
但是,运行以下查询将返回错误的结果:
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
对此行为有任何想法吗?
答案 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 TABLE
。 name
的排序规则很重要。
如果您使用默认排序规则或其他..._ci
排序规则,那么这是合适的:
WHERE e.name LIKE '%s%'
捕获大写和小写s
。
LIKE
和REGEXP
适用于检查子字符串。 LOCATE
适合查找字符串中某物的位置。