- 我有一個使用排序規則
first鍵入的列。varchar(190)utf8mb4_bin
當我執行以下查詢時,我只能按預期取回所有Joe :
SELECT first, last FROM person WHERE first = 'Joe'
我想得到的是Joe, joe, jOe, joE, jOE, JoE, JOE, 和 JOe。基本上是在區分大小寫的欄位上進行不區分大小寫的搜索。
我該怎么做呢?
CREATE TABLE `person` (
`id` int NOT NULL AUTO_INCREMENT,
`first` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL,
`middle` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL,
`last` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL,
`job` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id_UNIQUE` (`id`),
UNIQUE KEY `names_unq` (`first`,`middle`,`last`,`job`),
KEY `index_job` (`job`),
KEY `index_first` (`first`,`job`),
KEY `index_first_last` (`first`,`last`,`job`),
KEY `index_middle` (`middle`,`job`),
KEY `index_last` (`job`,`last`)
) ENGINE=InnoDB AUTO_INCREMENT=99750823 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
uj5u.com熱心網友回復:
您可以在字串比較運算式中指定排序規則以覆寫比較中使用的排序規則。閱讀https://dev.mysql.com/doc/refman/8.0/en/charset-literal.html了解更多詳情。
CREATE TABLE `person` (
`first` text COLLATE utf8mb4_bin,
`last` text COLLATE utf8mb4_bin
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
mysql> select first, last from person where first = 'Joe';
------- -------
| first | last |
------- -------
| Joe | Grant |
------- -------
mysql> select first, last from person where first = 'joe';
Empty set (0.00 sec)
mysql> select first, last from person where first = 'joe' collate utf8mb4_unicode_ci;
------- -------
| first | last |
------- -------
| Joe | Grant |
------- -------
uj5u.com熱心網友回復:
使用“collat??e utf8mb4_unicode_ci”,因為它會與您給出的任何過濾條件進行一對一的比較。
uj5u.com熱心網友回復:
最簡單的方法是使用UPPER().
注意:這不是優化的(除非有一個不太可能的索引 UPPER()),但它是簡單查詢的快速修復。我不建議在未測驗速度/成本的情況下將其用于大規模或生產查詢。
SELECT first, last FROM person WHERE UPPER(first) = 'JOE';
如果您匹配一個引數,您可能需要在兩側使用 upper ,如
SELECT first, last FROM person WHERE UPPER(first) = UPPER(@name);
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/441832.html
上一篇:找到X的直接上和下
