据我所知,无符号 bigint 是 mysql 中的最大 int 大小。因此,为了更好地衡量,我使用 varchar(255),因为我的数据库中的某些值大于无符号 bigint。
我想订购它们,就好像它们是 int 一样。这可能吗?
示例:999,1000,1001
通过 Int 订购此产品为 999,1000,1001 或 1001,1000,999
通过 varchar 订购此内容为 1000,1001,999 或 999,1001,1000
由于通过 varchar 排序一次比较一个字符串
我想知道是否可以通过 varchar 存储它,但排序类似于 int
如果所有的值都是正整数并且它们从来没有前导 0,您可以尝试以下排序方法:
这样,较短的字符串文字将正确地排在较长的字符串之前,正如预期的那样。具有相同位数的数字将根据您的活动排序规则进行排序,我希望已经以理智的方式对数字进行排序(0、1、2、3、4、5、6、7、8、9)。
要反转排序方向,只需替换
ASC
为DESC
:BIGINT UNSIGNED
最高约为 19 位,并将精度保持在“1”。考虑
FLOAT
。它的最高位数约为 38 位,但精度仅为 7 位左右。(并且只需要 4 个字节来存储)。或者
DOUBLE
-- 308 位,16 位精度。8 个字节。或者(如前所述)
DECIMAL(65,0)
——65、65、29 字节。还有一个想法...... a
VARCHAR
和 aDOUBLE
。用于VARCHAR
存储很长的数字字符串以及DOUBLE
排序和排序。(缺陷:前 16 位相同的两个数字可能排序不正确;你能忍受吗?)VARCHAR(255) CHARACTER SET ascii COLLATE ascii_bin
-- 255, 255, <=256TEXT CHARACTER SET ascii COLLATE ascii_bin
-- 65535, 65535, <=65537MEDIUMTEXT CHARACTER SET ascii COLLATE ascii_bin
-- ~16M-1, ~16M, <=16M+3考虑
INT UNSIGNED
等。这为每个 *INT 类型提供了一个额外的范围,而不是默认的SIGNED
. (UNSIGNED
与其他数据类型无关或不必要。)您要存储255 位数字?原谅我,但我不这么认为。
对我来说,这看起来不像是十进制数(尽管 99,910,001,001会)。在我
看来,这就像存储在同一字段中的 [三个] 十进制数字的数组。 正如您所发现的,这是一个坏主意。
用原始记录的主键加上这个新值将它们拆分成一个 [子] 表。
然后,您可以对适当的整数字段进行整数排序。
套用蒙哥马利斯科特的一句话: