MySQL - Select 其中第一个字符是小写或大写
MySQL - Select where first character is lowercase or uppercase
抱歉,如果这是之前有人问过的问题,但我找不到这个问题的答案。
如何创建 MySQL select 语句来 select 数据库中第一个字符为小写或大写的所有字符串。
我通常会用这样的东西来 select 从英语单词数据库中随机抽取 10 个长度超过 8 个字符的单词:
SELECT word FROM en_dictionary WHERE CHAR_LENGTH(word)>8 ORDER BY RAND() LIMIT 10
不幸的是,这也是 select 我不希望出现在结果中的大写字母单词,因为它们通常是城市名称、物种名称等术语:
所以,我的问题是:有没有办法 select 只有以小写字母字符(或大写字母)开头的单词?
我可以做这样的事情并且它会起作用,但它会是一个非常丑陋的声明:
AND word LIKE BINARY 'a%' AND word LIKE BINARY 'b%' AND word LIKE BINARY 'c%'...
您可以使用Ascii()
功能。它returns输入字符串最左边字符的数值。
对于小写第一个字符:a
的ASCII码是97和z
是122。所以,第一个字符的ASCII码应该在97到122之间。
SELECT word
FROM en_dictionary
WHERE CHAR_LENGTH(word) > 8
AND ASCII(word) BETWEEN 97 AND 122
ORDER BY RAND() LIMIT 10
对于大写第一个字符:A
的ASCII码是65,Z
是90。所以,第一个字符的ASCII码应该在65到90之间。
SELECT word
FROM en_dictionary
WHERE CHAR_LENGTH(word) > 8
AND ASCII(word) BETWEEN 65 AND 90
ORDER BY RAND() LIMIT 10
您可以使用 SUBSTRING 和 REGEXP BINARY
SELECT word
FROM en_dictionary
WHERE CHAR_LENGTH(word)>8
AND SUBSTRING(word, 1, 1) REGEXP BINARY '[A-Z]'
ORDER BY RAND() LIMIT 10
使用 REGEXP BINARY 您可以根据需要使用任何正则表达式,请参阅文档:https://dev.mysql.com/doc/refman/8.0/en/regexp.html
SUBSTRING 只是为了获取第一个字母。
见
How to check for uppercase letters in MySQL?
MySQL Select Query - Get only first 10 characters of a value
不是一个完整的答案,但对于评论来说太长了,所以我从中做了一个答案。
我建议您使用区分大小写的 utf8 整理,例如 utf8_bin
。
然后你不需要使用 BINARY 或其他 MySQL "hacks" 来获得你需要的结果你可以简单地使用 LIKE/BETWEEN 区分大小写没有问题。
创建table
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 |
所以你的查询应该是
查询
SELECT
word
FROM
en_dictionary
WHERE
CHAR_LENGTH(word) > 8
AND
word BETWEEN 'a' AND 'z'
ORDER BY
RAND()
LIMIT 10
编辑于 2019 年 8 月 11 日
This will miss words like 'zahn' because it's not <= 'z', use
'zzzzzzz' instead
感谢 dnoeth 的评论和 2019 年 7 月 11 日晚些时候的一次很晚的争吵 session 在某些情况下,上面的 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..
抱歉,如果这是之前有人问过的问题,但我找不到这个问题的答案。 如何创建 MySQL select 语句来 select 数据库中第一个字符为小写或大写的所有字符串。
我通常会用这样的东西来 select 从英语单词数据库中随机抽取 10 个长度超过 8 个字符的单词:
SELECT word FROM en_dictionary WHERE CHAR_LENGTH(word)>8 ORDER BY RAND() LIMIT 10
不幸的是,这也是 select 我不希望出现在结果中的大写字母单词,因为它们通常是城市名称、物种名称等术语:
所以,我的问题是:有没有办法 select 只有以小写字母字符(或大写字母)开头的单词?
我可以做这样的事情并且它会起作用,但它会是一个非常丑陋的声明:
AND word LIKE BINARY 'a%' AND word LIKE BINARY 'b%' AND word LIKE BINARY 'c%'...
您可以使用Ascii()
功能。它returns输入字符串最左边字符的数值。
对于小写第一个字符:a
的ASCII码是97和z
是122。所以,第一个字符的ASCII码应该在97到122之间。
SELECT word
FROM en_dictionary
WHERE CHAR_LENGTH(word) > 8
AND ASCII(word) BETWEEN 97 AND 122
ORDER BY RAND() LIMIT 10
对于大写第一个字符:A
的ASCII码是65,Z
是90。所以,第一个字符的ASCII码应该在65到90之间。
SELECT word
FROM en_dictionary
WHERE CHAR_LENGTH(word) > 8
AND ASCII(word) BETWEEN 65 AND 90
ORDER BY RAND() LIMIT 10
您可以使用 SUBSTRING 和 REGEXP BINARY
SELECT word
FROM en_dictionary
WHERE CHAR_LENGTH(word)>8
AND SUBSTRING(word, 1, 1) REGEXP BINARY '[A-Z]'
ORDER BY RAND() LIMIT 10
使用 REGEXP BINARY 您可以根据需要使用任何正则表达式,请参阅文档:https://dev.mysql.com/doc/refman/8.0/en/regexp.html
SUBSTRING 只是为了获取第一个字母。
见
How to check for uppercase letters in MySQL?
MySQL Select Query - Get only first 10 characters of a value
不是一个完整的答案,但对于评论来说太长了,所以我从中做了一个答案。
我建议您使用区分大小写的 utf8 整理,例如 utf8_bin
。
然后你不需要使用 BINARY 或其他 MySQL "hacks" 来获得你需要的结果你可以简单地使用 LIKE/BETWEEN 区分大小写没有问题。
创建table
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 |
所以你的查询应该是
查询
SELECT
word
FROM
en_dictionary
WHERE
CHAR_LENGTH(word) > 8
AND
word BETWEEN 'a' AND 'z'
ORDER BY
RAND()
LIMIT 10
编辑于 2019 年 8 月 11 日
This will miss words like 'zahn' because it's not <= 'z', use 'zzzzzzz' instead
感谢 dnoeth 的评论和 2019 年 7 月 11 日晚些时候的一次很晚的争吵 session 在某些情况下,上面的 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..