Mysql的varchar排序按照數字順序

2021-07-15 07:05:29 字數 1911 閱讀 3032

自己建表的時候,把乙個字段型別建立為varchar(2) ,其實應該建為int(2)的。因為我只允許輸出數字。這本來也沒什麼,無非就是佔點空間,懶得改了。但是今天在後台發現排序有問題。於是,沒辦法,改之。下面簡單說一下mysql的varchar排序問題,引以為戒。

下面,我從資料庫裡面以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;也可以使用convert來搞定此問題:

select

server_id from

cardserver where

game_id =

1 order by

convert

(server_id,

signed

)desc

limit

10;

mysql 查詢varchar型別字段排序

首先,如果裡面存的是字母,會按 英文本母 順序排序,如果含有數字,按數字大小排序,如果含有漢字,按照所選擇的 漢字編碼 排序。一般情況下,int型別的字段可以直接使用max 函式查詢出某一列的最大值,但是對於varchar型的字段,我們有的時候需要排序或查最大值,直接用max 函式查最大值,會發現值...

mysql生成varchar型別主鍵排序

用uuid生成20位的主鍵 select left replace uuid 20 from dual另一種方法 因為資料庫中有字母 需要排序的時候去除字母,重新取最大值,然後加1算作新的主鍵 select ifnull dept id,0 1 from base dept order by dep...

mysql生成varchar型別主鍵排序

用uuid生成20位的主鍵 select left replace uuid 20 from dual另一種方法 因為資料庫中有字母 需要排序的時候去除字母,重新取最大值,然後加1算作新的主鍵 select ifnull dept id,0 1 from base dept order by dep...