Mysql 使用char索引查找数值

Mysql 使用char索引查找数值,mysql,select,indexing,Mysql,Select,Indexing,我在mysql表中有一列,它主要存储数值,但有时存储字符串。它被定义为VARCHAR(20)。此列上有前四个字符的索引 ADD INDEX `refNumber` USING BTREE(`refNumber`(4)); 由于该字段主要是数字字段,因此用户能够查询数值范围内的值(例如,100到2000)非常有用。如果使用数字比较,则不使用此索引 WHERE refNumber BETWEEN 100 AND 2000 如果我使用字符串比较,我会得到一些我不想要的值(例如,当查询100到200

我在mysql表中有一列,它主要存储数值,但有时存储字符串。它被定义为VARCHAR(20)。此列上有前四个字符的索引

ADD INDEX `refNumber` USING BTREE(`refNumber`(4));
由于该字段主要是数字字段,因此用户能够查询数值范围内的值(例如,100到2000)非常有用。如果使用数字比较,则不使用此索引

WHERE refNumber BETWEEN 100 AND 2000
如果我使用字符串比较,我会得到一些我不想要的值(例如,当查询100到2000的范围时,返回10000)

有好的解决办法吗

注意:有些值在前面用零填充,如0234,在查找100到2000之间的值时应返回这些值。

三种可能性

1) 将数值分隔到各自的列中

2) 如果你必须保持原样,决定数字的最大长度,将数字归零或空白填充到该长度


3) 我不知道MySQL是否支持基于函数的索引,但这可能是一种选择。如果是这样,请编写一个函数,返回提取的数值,并将其用作索引的基础。

您可以先尝试使用字符串比较,以便使用索引,然后仍然进行数值比较。它不应该太慢,因为第二个过滤器将只应用于一小部分行


refNumber BEETWEEN'100'和'2000'以及CAST(refNumber作为有符号整数)BEETWEEN 100和2000的位置
CAST()
在MySQL中如何处理非数值?这是一个有趣的建议。我认为强制转换不适用于非数值,当使用带数值的BETWEEN操作符时,它最终会抛出这些行。不过,我确实收到了一些关于数值非整数值的警告。对于我的特殊情况,我发现我有一些值,比如0234,它与字符串的第一个“BETWEEN”子句不匹配。我将编辑原始问题,以表明有一些值已填充。我怀疑填充或分隔数值可能是我面临的选项。我会等着看是否还有其他建议。
WHERE refNumber BETWEEN '100' AND '2000'