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码是97z122。所以,第一个字符的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码是65Z90。所以,第一个字符的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             |

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 日

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 的单词,例如 zahnzzzzzzzzz。 上述查询的有效补丁是使用 REPEAT('<char>', <number_of_size_of_table_column_datatype>) 作为最大范围,在这种情况下意味着 word BETWEEN 'a' AND REPEAT('z', 255)

补丁的demo..