Mysql 从以字符串形式保存数字的列中获取最小值

Mysql 从以字符串形式保存数字的列中获取最小值,mysql,casting,Mysql,Casting,我将数字保存为字符串,因为它们通常大于MySQL允许的整数最大限制 我试图从这个列中得到最小值和最大值,但只是比较字符串返回的结果非常不同 我尝试向查询中添加CONVERT子句,如下所示: "SELECT end_timestamp FROM ".$db_table_prefix."user_events ORDER BY CONVERT('end_timestamp', SIGNED INTEGER) DESC LIMIT 1" 但结果是不正确的。我认为CONVERT子句没有像我期望的那样转

我将数字保存为字符串,因为它们通常大于MySQL允许的整数最大限制

我试图从这个列中得到最小值和最大值,但只是比较字符串返回的结果非常不同

我尝试向查询中添加CONVERT子句,如下所示:

"SELECT end_timestamp FROM ".$db_table_prefix."user_events ORDER BY CONVERT('end_timestamp', SIGNED INTEGER) DESC LIMIT 1"
但结果是不正确的。我认为CONVERT子句没有像我期望的那样转换成整数


那么,将字符串转换为整数并获得最小值的最佳方法是什么呢?

如果您将一个数字作为字符串,并且它是一个不带前导0的整数,则可以通过先比较长度,然后比较值来进行比较。例如,以下内容将按
col1
正确排序(假设上述内容):

因此,获得最小值的一种方法是:

select col1
from t
order by char_length(col1), col1
limit 1;
您也可以通过执行以下操作在
组中同时获得这两个信息:

select substring_index(group_concat(col1 order by char_length(col1), col1), ',', 1
                      ) as mincol1,
       substring_index(group_concat(col1 order by char_length(col1) desc, col1 desc), ',', 1
                      ) as maxcol1
from t;

如果在数字和/或小数位前面有零,想法是一样的,但是编码有点复杂。

我没有一个MySQL实例可供测试,但似乎有一个解决方法可以解决您的问题。我不知道这里的问题是数字太大,无法转换,但是如果它们在数据库中不能是整数,为什么可以将它们转换为数据库之外的整数呢

试着这样做:

"SELECT end_timestamp FROM ".$db_table_prefix."user_events ORDER BY CHAR_LENGTH(end_timestamp) DESC, end_timestamp DESC LIMIT 1"
这将首先按字符数排序,这是字符串对数字进行排序的地方(只要没有任何前导零),然后对长度相同的数字进行数字排序。如果仍然不起作用,您可能需要“选择CHAR\u LENGTH(end\u timestamp)作为ts\u len”来计算sort命令之外的值。这就是我真的不知道哪一个会起作用的地方,因为我没有一个MySQL实例可供测试


您可能还需要考虑一个更适合于时间戳的数据类型,例如“代码>时间戳< /COD>或<代码> DATETIME//COD>,这可能在数据库之外的时候转换为您需要的格式。

最好的方法是将数字存储为数字。除了
INT
,还有
BIGINT
可以存储从
-(2^63)
(2^63)-1
的任意整数值。还有允许更大值的
DECIMAL
数据类型。非常感谢这一点,它似乎与我接受的方法相同,尽管它似乎对我不起作用。感谢这一点,它很好地为我获得了最大值。我现在正在和它合作,以得到最小的一个。不幸的是,我不得不绕过timestamp/datetime类型,因为时间戳仅限于UNIX epoch(我需要时间戳从0000-00-00 00:00:00开始),而datetime只能追溯到1000-01-01。。。不幸的是,在32位系统上,int不能切断它。感谢您提供的解决方案:)
"SELECT end_timestamp FROM ".$db_table_prefix."user_events ORDER BY CHAR_LENGTH(end_timestamp) DESC, end_timestamp DESC LIMIT 1"