虽然不是完整的答案,但这个回复太长了,无法作为评论,所以我把它做成了一个回答。
我建议您使用区分大小写的 utf8 校对规则,例如 utf8_bin
。
然后您就不需要使用 BINARY 或其他 MySQL “技巧” 来获取您需要的结果,您可以简单地使用 LIKE/BETWEEN 和区分大小写而没有问题。
创建表格
CREATE TABLE test (
utf8_general_ci_word VARCHAR(255) COLLATE utf8_general_ci
, utf8_bin_word VARCHAR(255) COLLATE utf8_bin
);
INSERT INTO test (utf8_general_ci_word, utf8_bin_word) VALUES('a', 'a');
INSERT INTO test (utf8_general_ci_word, utf8_bin_word) VALUES('A', 'A');
INSERT INTO test (utf8_general_ci_word, utf8_bin_word) VALUES('b', 'b');
INSERT INTO test (utf8_general_ci_word, utf8_bin_word) VALUES('B', 'B');
Results
Query #1
SELECT
utf8_general_ci_word
FROM
test
WHERE
utf8_general_ci_word LIKE 'a%'
;
| utf8_general_ci_word |
|
| a |
| A |
Query #2
SELECT
utf8_general_ci_word
FROM
test
WHERE
utf8_general_ci_word LIKE BINARY 'a%'
;
| utf8_general_ci_word |
|
| a |
Query #3
SELECT
utf8_bin_word
FROM
test
WHERE
utf8_bin_word LIKE 'a%';
| utf8_bin_word |
|
| a |
演示
因此,您的查询可能类似于
查询
SELECT
word
FROM
en_dictionary
WHERE
CHAR_LENGTH(word) > 8
AND
word BETWEEN 'a' AND 'z'
ORDER BY
RAND()
LIMIT 10
测试数据演示
编辑于 2019年08月11日
这会错过像 'zahn' 这样的单词,因为它不是 <= 'z',请使用 'zzzzzzz' 代替
感谢 dnoeth 的评论和在 2019年11月07日晚些时候的一次很晚的协商会议,对于某些情况,上述SQL确实存在一个错误..
由于 word BETWEEN 'a' AND 'z'
是语法糖,表示 word >= 'a' AND word <= 'z'
,因此这确实不匹配大于 z
的单词,如 zahn
或 zzzzzzzzz
。
针对上面的查询,有效的修补方法是将 REPEAT('<char>', <number_of_size_of_table_column_datatype>)
用作最大范围,即在本例中使用 word BETWEEN 'a' AND REPEAT('z', 255)
这是修补程序的 演示..
utf8_bin
(区分大小写)。 - Raymond Nijland