写点什么

mysql 进阶 (八) 排序问题方案探究

  • 2022 年 7 月 19 日
  • 本文字数:1254 字

    阅读完需:约 4 分钟

mysql进阶(八)排序问题方案探究

一、前言

mysql默认order by 只对数字与日期类型可以排序,但对于varchar字符型类型排序好像没有用了,下面我来给各位同学介绍 varchar 类型排序问题如何解决。


今天在对国家电话号码表进行排序的时候发现了一个有趣的问题,我想让 isdcode 字段按照由小到大的顺序排序,于是乎我是这样写的

SELECT * FROM gb_country_isdcode ORDER BY isdcode asc;
复制代码

结果如下,发现竟然不是我想要的结果,asc排序是对的呀,于是乎我找呀找,找呀找,终于找到原因了;

isdcode 是 varcher 类型的,如果排序直接用asc显然是不行的,必须将他转换成int类型然后就可以正常排序了,只要isdcode + 0就可以了

于是乎这样写

SELECT * FROM gb_country_isdcode ORDER BY (isdcode+0) asc;
复制代码

好像是想要的那种数据比较大小的了呀。。可是为什么+0 就好了呢?原来,+0 后就转换INT类型排序了。这样就可以按照大小排序了。

二、中文排序

如果不是电话而是汉字怎么办,汉字排序我们只要进行简单转换即可排序了。


mysql中使用order by对存储了中文信息的字段,默认出来的结果并不是按汉字拼音的顺序来排序,要想按汉字的拼音来排序,需要把数据库的字符集设置为UTF8,然后在order by时候强制把该字段信息转换成GBK,这样出来的结果就是按拼音顺序排序的。例如:

SELECT * FROM table_name ORDER BY CONVERT(column_name USING gbk);
复制代码

在 mysql 中试了一下,结果很令人满意。

结论是:查询的时候,通过convert函数,把查询出来的数据使用的字符集gb2312编码就可以了,然后使用convert之后的中文排序。但是如果真的去把表中字段的字符集改成gb2312,又会涉及到很多编码的问题,页面传值啊,从数据库中存取啊,很麻烦。只要在查询的时候,指定一下字符集,并不是真的把物理字段改成gb2312,相对比较简单。

三、延伸阅读 MySQL 外键在数据库中的作用

MySQL外键的目的是控制存储在外键表中的数据,使两张表形成关联,是MySQL数据库中非常重要的组成部分,值得我们去深入了解。那么,MySQL外键究竟起到哪些作用呢?下文就将带你一探其中的秘密。

3.1 MySQL 外键的作用

保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。使两张表形成关联,外键只能引用外表中列的值!

3.2 建立外键的前提

本表的列必须与外键类型相同(外键必须是外表主键)。

指定主键关键字: foreign key(列名)

引用外键关键字: references <外键表名>(外键列名)

3.3 事件触发限制

on deleteon update, 可设参数cascade(跟随外键改动), restrict(限制外表中的外键改动),set Null(设空值),set Default(设默认值),[默认]no action

     

outTable 表 主键 id 类型 int

创建含有外键的表:

create table temp(
   id int,
   name char(20),
   foreign key(id) references outTable(id) on delete cascade on update cascade);
复制代码

说明:把 id 列设为 MySQL 外键,参照外表 outTable 的 id 列。当外键的值删除,本表中对应的列删除;当外键的值改变 本表中对应的列值改变。


MySQL中一张表只能有一个主键,主键可以由多个字段组成。


发布于: 刚刚阅读数: 5
用户头像

No Silver Bullet 2021.07.09 加入

岂曰无衣 与子同袍

评论

发布
暂无评论
mysql进阶(八)排序问题方案探究_MySQL_No Silver Bullet_InfoQ写作社区