Is today in the background to find a sort of problem. So, there's no way to change it. Here is a brief look at MySQL varchar sorting problem, warning.
Sample Table structure:
Let's take a look at my table structure
The code is as follows |
Copy Code |
show "create Table Cardserver G *************************** 1. Row *************************** table:cardserver Create table:create Table ' cardserver ' ( ' id ' int (one) not NULL default ' 0 ', ' ver ' int (one) default null, ' createtime ' datetime default NULL, ' updatetime ' datetime de Fault null, ' game_id ' int (2) NOT null default ' 0 ', ' server_id ' varchar (2) is not null default ', & nbsp ' server_name ' varchar 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) because there is a foreign key, so I do not want to change the field type, laborious ah. Oh. Although finally I chose to change the field type, this is something. Because what I want to illustrate in this log is the varchar sort problem. So no longer explain how I changed the field type, you are interested in searching my previous log. (Cheat click)
Phenomenon Description:
below, I from the database in order to server_id, we look at the sort of results:
code is as follows |
copy code |
select server_id from cardserver where game_id = 1 order BY server_id DESC limit 10;< br> +-----------+ | server_id | +-----------+ | 8 | | 7 | | 6 | | 5 | | 4 | | 3 | | 2 | | 10 | | 1 | |
+-----------+ Obviously, I want the result to be 10,8,7,6,5. But this 10 line is in the back of 2. is arranged according to a string. In fact, I want to think of it as a numerical row.
Manual Conversion Type:
You can use the following method, so that the server_id+0 after sorting, the problem is resolved.
code is as follows |
copy code |
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 | +-----------+ |
Using the MySQL function Cast/convert:
MySQL provides us with two types of conversion functions: cast and convert, ready-made things how can we let go?
The CAST () and CONVERT () functions can be used to get a value of one type and to produce a value of another type.
This type can be one of the following values:
binary[(N)]
char[(N)]
DATE
Datetime
DECIMAL
Signed [INTEGER]
Time
UNSIGNED [INTEGER]
So we can also use cast to solve the problem:
The code is as follows |
Copy Code |
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 | +-----------+ |
You can also use convert to fix this problem:
The code is as follows |
Copy Code |
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 | +-----------+ |
Summary: There are many ways to see their own brain, the so-called road to Rome is also the meaning of the.