mysql-选择第一个字符是小写还是大写

ugmeyewa  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(407)

抱歉,如果这是以前问过的问题,但我找不到答案。如何创建mysql select语句,从数据库中选择第一个字符为小写或大写的所有字符串。
我通常会用这样的方法从英语单词库中随机选择10个长度超过8个字符的单词:

SELECT word FROM en_dictionary WHERE CHAR_LENGTH(word)>8 ORDER BY RAND() LIMIT 10

不幸的是,这也选择了大写字母的单词,我不想在结果中出现,因为它们通常是城市名称、物种等术语:

所以,我的问题是:有没有办法只选择以小写字母(或大写字母)开头的单词?
我可以做这样的事情,它会起作用,但这将是一个非常丑陋的声明:

AND word LIKE BINARY 'a%' AND word LIKE BINARY 'b%' AND word LIKE BINARY 'c%'...
w8f9ii69

w8f9ii691#

可以使用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,您可以根据需要使用任何regex,请参阅文档:https://dev.mysql.com/doc/refman/8.0/en/regexp.html
substring只是用于获取第一个字母。
看到了吗
如何在mysql中检查大写字母?
mysql select query-仅获取值的前10个字符

ghhkc1vu

ghhkc1vu2#

不是一个完整的答案,但方式大的评论,所以我做了一个答案出来。
我建议你使用区分大小写的utf8格式 utf8_bin .
然后你不需要使用二进制或其他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');

结果
查询#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年11月8日
这将错过像“zahn”这样的词,因为它不是<=“z”,请改用“zzzzz”
多亏了dnoeth的评论和2019年11月7日晚些时候的一个非常晚的辩论会,在某些情况下,上面的sql中确实存在一个bug。。
作为 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) 补丁的演示。。

af7jpaap

af7jpaap3#

你可以用 Ascii() 功能。它返回输入字符串最左边字符的数值。
对于小写第一个字符:ascii码 a 是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

对于大写第一个字符:ascii码 A 是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

相关问题