MySQL 字段的排序规则可能导致的难以发现的 BUG

本贴最后更新于 2135 天前,其中的信息可能已经时移世易

很多人用的是默认的以 _ci 结尾的排序规则;

  • _ci 结尾表示大小写不敏感(caseinsensitive)
  • _cs 表示大小写敏感(case sensitive)
  • _bin 表示二进制的比较(binary)
    如果对应的字段是需要区分大小写比对的,那么可能会出现错判的情况;
    例如一个 Token: AAbb
    如果排序规则是 utf8_general_ci
    那么 aabb 也是会 match 的.
    这种情况,请修改排序规则为 utf8_bin.

-------- 以下内容是转载自 https://www.cnblogs.com/zjfjava/p/7639535.html-----------

utf8_unicode_ci 和 utf8_general_ci 对中、英文来说没有实质的差别。
utf8_general_ci 校对速度快,但准确度稍差。
utf8_unicode_ci 准确度高,但校对速度稍慢。

如果你的应用有德语、法语或者俄语,请一定使用 utf8_unicode_ci。一般用 utf8_general_ci 就够了。

例如你运行:
SELECT * FROM table WHERE txt = 'a'
那么在 utf8_bin 中你就找不到 txt = 'A' 的那一行, 而 utf8_general_ci 则可以。
utf8_general_ci 不区分大小写,这个你在注册用户名和邮箱的时候就要使用。
utf8_general_cs 区分大小写,如果用户名和邮箱用这个 就会照成不良后果
utf8_bin:字符串每个字符串用二进制数据编译存储。区分大小写,而且可以存二进制的内容

  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    673 引用 • 535 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • someone

    排序规则的问题确实很容易带来 BUG,很少有人注意到排序规则和大小写是否敏感有关系.

  • someone

    找到一篇 MySQL 存储过程的全面介绍的文章,写得不错.