我在mysql表上有一个列,主要存储数值,但有时候是字符串。它被定义为VARCHAR(20)。此列的前四个字符有一个索引。
ADD INDEX `refNumber` USING BTREE(`refNumber`(4));
由于该字段主要是数字,因此用户能够查询属于数值范围(例如,100到2000)的值是有用的。如果我使用数字比较,则不使用此索引。
WHERE refNumber BETWEEN 100 AND 2000
如果我使用字符串比较,我会得到一些我不想要的值(例如,当查询100到2000的范围时,10000会返回)。
WHERE refNumber BETWEEN '100' AND '2000'
这有一个很好的解决方案吗?
注意:有一些值记录在前面填充零,如0234,在查找100到2000之间的值时应该返回。
答案 0 :(得分:1)
三种可能性
1)将数值分隔到它们自己的列中。
2)如果必须保持原样,请确定数字的最大长度,将数字填零或空白填充到该长度。
3)我不知道MySQL是否支持基于函数的索引,但这可能是一个选项。如果是这样,编写一个返回提取的数值的函数,并将其用作索引的基础。
答案 1 :(得分:-1)
您可以先尝试使用字符串比较,以便使用索引,然后仍然进行数字比较。它不应该减慢太多,因为第二个过滤器只适用于行的一小部分。
WHERE refNumber BEETWEEN '100' AND '2000' AND CAST(refNumber as SIGNED INTEGER) BEETWEEN 100 AND 2000