自己建表的时候,把一个字段类型创建为varchar(2) ,其实应该建为int(2)的。因为我只允许输出数字。这本来也没什么,无非就是占点空间,懒得改了。但是今天在后台发现排序有问题。于是,没办法,改之。下面简单说一下MySQL的varchar排序问题,引以为戒。

show

create

table cardserver /G

***************************

1. row

***************************

Table: cardserver

Create

Table:

CREATE

TABLE

`cardserver`

(

`id`

int

(

11

)

NOT

NULL

default

'0'

,

`ver`

int

(

11

)

default

NULL

,

`createtime`

datetime

default

NULL

,

`updatetime`

datetime

default

NULL

,

`game_id`

int

(

2

)

NOT

NULL

default

'0'

,

`server_id`

varchar

(

2

)

NOT

NULL

default

''

,

`server_name`

varchar

(

40

)

NOT

NULL

default

''

,

PRIMARY KEY

(

`id`

)

,

UNIQUE

KEY

`game_id_server_id`

(

`game_id`

,

`server_id`

)

,

UNIQUE

KEY

`game_id_server_name`

(

`game_id`

,

`server_name`

)

)

ENGINE=InnoDB

DEFAULT

CHARSET

=gbk

1 row

in

set

(

0.00 sec

)

下面,我从数据库里面以server_id排一下序,大家来看一下排序后的结果:

select server_id

from cardserver

where game_id

=

1

order by server_id

desc

limit

10

;

+-----------+

| server_id

|

+-----------+

|

8

|

|

7

|

|

6

|

|

5

|

|

4

|

|

3

|

|

2

|

|

10

|

|

1

|

+-----------+

很明显,我想要的结果应该是 10,8,7,6,5 这样的。但是这个10排在了2的后面。按照字符串来排的。其实我是想把它当做数值来排。

手动转换类型:

用下面的方法就可以了,使server_id+0之后再排序,问题解决了。

select server_id

from cardserver

where game_id

=

1

order by server_id

+

0

desc

limit

10

;

+-----------+

| server_id

|

+-----------+

|

10

|

|

8

|

|

7

|

|

6

|

|

5

|

|

4

|

|

3

|

|

2

|

|

1

|

+-----------+

使用MySQL函数CAST/CONVERT:

mysql为我们提供了两个类型转换函数:CAST和CONVERT,现成的东西我们怎能放过?

CAST() 和CONVERT() 函数可用来获取一个类型的值,并产生另一个类型的值。

这个类型 可以是以下值其中的 一个:

BINARY[(N)]

CHAR[(N)]

DATE

DATETIME

DECIMAL

SIGNED [INTEGER]

TIME

UNSIGNED [INTEGER]

所以我们也可以用CAST解决问题:

select server_id

from cardserver

where game_id

=

1

order by CAST

(server_id

as

SIGNED

)

desc

limit

10

;

+-----------+

| server_id

|

+-----------+

|

10

|

|

8

|

|

7

|

|

6

|

|

5

|

|

4

|

|

3

|

|

2

|

|

1

|

+-----------+

也可以使用CONVERT来搞定此问题:

select server_id

from cardserver

where game_id

=

1

order by

CONVERT

(server_id

,

SIGNED

)

desc

limit

10

;

+-----------+

| server_id

|

+-----------+

|

10

|

|

8

|

|

7

|

|

6

|

|

5

|

|

4

|

|

3

|

|

2

|

|

1

|

+-----------+

总结:

条条大道通罗马,条条小路通我家。不管是啥方法,解决问题就是好方法。当然,既然MySQL为我们提供了现成的函数。我们为何不让代码显得更漂亮些呢?呵呵。

所以MySql varchar排序我推荐使用CAST或CONVERT函数。

mysql排序convert_mysql里的varchar值转换为可排序的值(MySql varchar排序 CAST ,CONVERT)...相关推荐

  1. MySQL 所推荐的左右值法(毗邻目录法、预排序历遍法)

    毗邻目录法: 这种方法说白了就是子类,依赖父类,父类依赖爷爷类,爷爷类可以有多个儿子类,跟父类平级的类.一层一层的. 预排序历遍法: 这种算法比较高端,使用的是mysql官方推荐的左右算法. 使用场合 ...

  2. 关于mysql设置varchar 字段的默认值''和null的区别,以及varchar和char的区别

    一.背景 根据业务需求,发现以前的同事在设计表的时候,很多字段都没有设置默认值.在mysql5.7版本之后,没有设定默认值的字段,在严格模式下是很容易报错的,所以我这边需要先给每个字段加上一个默认值. ...

  3. mysql char null_关于mysql设置varchar 字段的默认值''和null的区别,以及varchar和char的区别...

    一.背景 根据业务需求,发现以前的同事在设计表的时候,很多字段都没有设置默认值.在mysql5.7版本之后,没有设定默认值的字段,在严格模式下是很容易报错的,所以我这边需要先给每个字段加上一个默认值. ...

  4. mysql varchar cast_MYSQL VARCHAR排序 CAST ,CONVERT函数 类型转换

    自己建表的时候,把一个字段类型创建为varchar(2) ,其实应该建为integer(2)的,但是今天在后台发现排序有问题,varchar排序有问题,所以该怎么解决呢? 示例表结构: 先来看一下,我 ...

  5. mysql+两行+一样+筛选_MySQL计算相邻两行某列差值的方法

    简述 博主最近因工作任务缠身,都无暇顾及到我的这片自留地了.前段时间稍有空闲,花了较多的精力学习<啊哈算法>,从中学习到很多之前没有太注重的内容,收益颇丰.但是这些算法题目还没有看完,等后 ...

  6. MySQL外键约束On Delete、On Update各取值的含义

    主键.外键和索引的区别?   主键 外键 索引 定义: 唯一标识一条记录,不能有重复的,不允许为空 表的外键是另一表的主键, 外键可以有重复的, 可以是空值 主索引(由关键字PRIMARY定义的索引) ...

  7. mysql group by 区分null 值和非null_你知道mysql中空值和null值的区别吗

    前言 最近发现带的小伙伴写sql对于空值的判断方法不正确,导致程序里面的数据产生错误,在此进行一下整理,方便大家以后正确的判断空值.以下带来示例给大家进行讲解. 建表 create table tes ...

  8. MySQL buffer pool里的三种链表和三种page

    mysql buffer pool里的三种链表和三种page buffer pool是通过三种list来管理的 1) free list 2) lru list 3) flush list buffe ...

  9. mysql date 默认值_通过Oracle DB了解MySQL

    Oracle数据库是业界的翘楚,各行各业拥有大量的Oracle DB的DBA,本文尝试通过将Oracle与MySQL数据库的架构.安全.模式对象.数据类型及数据存储进行对比,以方便熟悉Oracle数据 ...

最新文章

  1. 如何设计权限管理模块
  2. iOS学习资源(三)
  3. linux系统中建立网络白名单,Linux下设置防火墙白名单(RHEL 6和CentOS 7)的步骤
  4. android log system
  5. 字符串-字符串的查找和替换
  6. 时光机穿梭---工作区和暂存区
  7. javascript --- 创建一个二维数组
  8. 纪中A组模拟赛总结(2021.7.16)
  9. aspx 远程上传服务器,ASP.NET中利用WebClient上传图片到远程服务的方法
  10. cron表达式每一个小时_嵊泗新闻网丨两千小时的热爱——任春华:用志愿服务守护每一个笑容...
  11. 复杂系统建模计算机仿真是干嘛的,复杂系统建模和 与仿真.ppt
  12. 异常和Log4j日志
  13. roseha修改服务器ip地址,roseha 9.0 for windows维护手册_v2.0-2015-04.pdf
  14. html css画个人印章
  15. 1143 Lowest Common Ancestor
  16. 华为电脑怎么录屏?分享你两个好方法
  17. 学习一样新东西行而有效的方法
  18. spring cloud gateway - 日志
  19. 【论文写作】——公式居中,编号居右
  20. EOS将发布的官方EVM怎么样?

热门文章

  1. java实现三天免登陆_[内附完整源码和文档] 基于Java的人事档案管理系统
  2. 软酷网 推IT课程免费在线学计划
  3. 帝国cms验证码校验方法
  4. 2023年淮阴工学院五年一贯制专转本应用文写作考试大纲
  5. [转] 100部陪伴我们长大的电影 !
  6. pyqt5——Dock Widget
  7. [无线网络]为什么WiMAX没有普及
  8. 10年内,这三大领域将被人工智能和大数据重塑!
  9. 如何创建webp格式的图片
  10. (转)我是怎么治愈鼻窦炎的