自己建表的時候,把乙個字段型別建立為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() 函式可用來獲取乙個型別的值,並產生另乙個型別的值。所以我們也可以用cast解決問題:這個型別 可以是以下值其中的 乙個:
binary[(n)]
char[(n)]
date
datetime
decimal
signed [integer]
time
unsigned [integer]
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...