不是一个完整的答案,但是对于一个评论来说太大了,所以我做了一个答案。
我建议您使用区分大小写的 utf8 排序规则,例如 utf8_bin。
然后你不需要使用 BINARY 或其他 MySQL “hacks”来获得你需要的结果,你可以简单地使用 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');
结果
查询 #1
SELECT
utf8_general_ci_word
FROM
test
WHERE
utf8_general_ci_word LIKE 'a%'
;
| utf8_general_ci_word |
| -------------------- |
| a |
| A |
查询 #2
SELECT
utf8_general_ci_word
FROM
test
WHERE
utf8_general_ci_word LIKE BINARY 'a%'
;
| utf8_general_ci_word |
| -------------------- |
| a |
查询 #3
SELECT
utf8_bin_word
FROM
test
WHERE
utf8_bin_word LIKE 'a%';
| utf8_bin_word |
| ------------- |
| a |
demo
所以您的查询将类似于
查询
SELECT
word
FROM
en_dictionary
WHERE
CHAR_LENGTH(word) > 8
AND
word BETWEEN 'a' AND 'z'
ORDER BY
RAND()
LIMIT 10
demo on the test data
于 2019 年 8 月 11 日编辑
这会漏掉像“zahn”这样的词,因为它不是
感谢 dnoeth 的评论和 2019 年 7 月 11 日晚些时候的一次较晚的陪练会议,在某些情况下,上面的 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)
补丁的demo..