【问题标题】:Selecting all strings from database that starts with a lowercase letter从数据库中选择所有以小写字母开头的字符串
【发布时间】:2016-10-18 13:07:43
【问题描述】:

我正在尝试使用正则表达式选择数据库中所有以小写字母开头的字符串,但由于某种原因,它也选择了所有以大写字母开头的字符串。我做错了什么?

SELECT * 
FROM  `allData` 
WHERE response REGEXP  '^[a-z]'
LIMIT 0 , 30

【问题讨论】:

  • 根据docs:REGEXP is not case sensitive, except when used with binary strings.

标签: php mysql sql


【解决方案1】:

来自MySQL REGEXP manual:

REGEXP 不区分大小写,除非与二进制字符串一起使用。

您可能因此在使用二进制字符串时会有一些运气:

WHERE response REGEXP BINARY '^[a-z]'

用于演示的合理愚蠢的小提琴:http://sqlfiddle.com/#!9/7eade/3

编辑:正如 Ray 在 cmets 中所说,您可能应该使用 [[:lower:]] 来代替所有排序规则,例如

WHERE response REGEXP BINARY '^[[:lower:]]'

【讨论】:

  • 你不认为[[:lower:]] 在字符集和排序规则方面比[a-z] 更通用吗?
  • 非英文字母的字符?
  • @frosty 是的。现在可能不关心您的特定用例,但为什么不使用内置的免费赠品和未来保护您的查询?
【解决方案2】:

我会使用 mysql 的字符类名称来匹配 REGEXP BINARY :

  WHERE response REGEXP BINARY  '^[[:lower:]]'

我不知道[a-z] 是否在每个字符集和排序规则中都有意义,因为字符类名称[:lower:] 将始终匹配所有小写字母字符。

【讨论】:

    【解决方案3】:
    SELECT *
    FROM allData
    WHERE LOWER(LEFT(response, 1)) <> LEFT(response, 1)
    LIMIT 0 , 30
    

    ...但是,这可能会受到您的MySQL character collation的限制

    【讨论】:

      【解决方案4】:
      select * from alldata where lower(left(response,1)) COLLATE Latin1_General_CS_AS =left(response,1) and response is not null and response<>''
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-12
        • 1970-01-01
        • 2021-02-26
        • 2022-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多