【问题标题】:Sorting string of small letters and capital letters in alphabetical order by using order by clause in mysql在mysql中使用order by子句按字母顺序对小写字母和大写字母的字符串进行排序
【发布时间】:2016-03-06 08:42:20
【问题描述】:

我正在使用 mySQL 和排序规则 utf8mb4_general_ci

我尝试了以下查询: SELECT cid, cname from cust1 order by cname desc

结果是:

cid  cname     
3 bbb 
1 abc 
2 ABC 

上面的排序规则中是否设置了这种排序类型(小写字母降序排列)?

另外,如果我运行以下查询: SELECT cid, cname from cust1 order by cname

结果是:

cid  cname     
1 abc 
2 ABC 
3 bbb 

再次按升序排列,小写字母先出现。我不明白这一点。请给我解释一下。

如何更改数据库排序规则?

【问题讨论】:

    标签: mysql sql-order-by collation


    【解决方案1】:

    MySQL 有 ..._ci 排序规则。正如“ci”暗示的那样,这些是不区分大小写的。即a = A。 (_ci 也会去掉重音符号。)

    MySQL 有 ..._bin 排序规则。这些比较位。因此aA 不同。

    计划 A:在该列上使用 COLLATE utf8mb4_bin

    B 计划:ORDER BY cname DESC, id DESCORDER BY cname ASC, id ASC。这样,id 将强制第 1 行和第 2 行的顺序一致。(不是它不会强制在 aA 之间进行顺序。

    C 计划:ORDER BY cname DESC, cname COLLATE utf8mb4_bin DESC。 (我尚未验证此语法是否有效。)这应该以可预测的方式排序 'a' 和 'A'。

    【讨论】:

      【解决方案2】:

      MySQL 正在输出它遇到的第一个条目,因为在这种情况下它认为“ABC”与“abc”相同。

      你可以试试 ascii() 函数,比如“order by cname desc, ascii(cname) desc”。

      我认为您可以通过使用 alter table 来更改字符排序规则,如下所示: “alter table cust1 character set latin1 collat​​e latin1_swedish_ci”,或任何你想要的字符集。

      【讨论】:

      • Ascii 默认为 ascii_general_ci,即“不区分大小写”,因此操作方式相同。
      【解决方案3】:

      在数据库排序规则中: a 大于 A A 大于 b b 大于 B 对于同一个字母,小写字母比大写字母大。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-13
        • 2017-11-21
        • 2023-03-27
        • 2017-10-04
        • 1970-01-01
        • 1970-01-01
        • 2012-11-18
        • 1970-01-01
        相关资源
        最近更新 更多