【问题标题】:Case-sensitive string comparison in SQL (MariaDB, MySQL)SQL 中区分大小写的字符串比较(MariaDB、MySQL)
【发布时间】:2020-04-21 20:06:28
【问题描述】:

我在 StackOverflow(几年前发布)上阅读了很多关于这个问题的问题和答案,但我发现没有一个问题和答案都使用 10.3.22-MariaDB 服务器和 libmysql - 5.6 .43 作为数据库客户端。

我正在尝试执行以下操作: SELECT * FROM table WHERE 'column' = 'data' LIMIT 1
但是,如果column 的值是DaTadata,上面的命令将选择该行,而我正在努力只选择后者。

2011 年类似问题的答案(MySQL)建议:

SELECT * FROM table WHERE BINARY 'column' = 'data'
SELECT * FROM table WHERE 'column' = BINARY 'data'
SELECT * FROM table WHERE 'column' LIKE BINARY 'data'
SELECT * FROM table WHERE 'column' LIKE 'data' COLLATE latin1_general_cs

以上命令都不尊重字母的大小写。而且,最后一个甚至没有运行,因为

  1. 无法识别的关键字。 (在位置 45 的“COLLATE”附近)
  2. 意外令牌。 (靠近位置 53 的“latin1_general_cs”)

2020 年这个问题的解决方案是什么?我做错了什么或我的服务器出了什么问题?
任何帮助将不胜感激!

【问题讨论】:

    标签: mysql sql mariadb case-sensitive libmysql


    【解决方案1】:

    这应该可行:

    WHERE BINARY column = 'data'
    

    但是,如果您将column 放在单引号中,它将不起作用。这将是一个字符串,而不是列引用。

    【讨论】:

      【解决方案2】:

      这在没有 cloumn 周围的单引号的情况下有效

      SELECT * FROM table1 WHERE `column` LIKE 'data' COLLATE latin1_general_ci;
      

      正如您所要求的,排序规则必须符合字符集,所以如果您像我一样有 utf8mb5,您可以这样写:

      SELECT * FROM table1 WHERE `column` LIKE _latin1 'data'   COLLATE latin1_general_ci;
      

      【讨论】:

      • 我在使用这个时遇到了同样的两个错误。也许只是我的服务器配置不支持。
      • 你有哪个版本 mariadb 10.3 和 10.4 在我测试的版本 8 中也可以正常工作,所以更准确
      • 还有一个问题是您选择的排序规则不适用于utf8mb4,所以也许这也可能是一个问题,但是您的信息非常稀疏
      • 正如我的问题中提到的,我使用 10.3.22-MariaDB 服务器和 libmysql - 5.6.43 作为数据库客户端
      • 我添加了如何使用不知道 latin_general_ci 的 utf8mb4 数据库/表/列来执行此操作,您必须始终检查它。这适用于 mysql/mariadb 中的 evry 数据库。如果您仍然遇到错误,您必须提供一个小提琴示例,以便我可以检查
      猜你喜欢
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 2015-08-21
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多