我最近遇到了一个问题,其中一个查询导致了全表扫描,而它归结为一个列有一个我认为不同的定义,它是一个VARCHAR而不是INT。当查询“string_column = 17”查询运行时,它只是无法使用索引。这真的让我陷入了困境。
所以我去搜索并发现发生了什么,我看到的行为与MySQL's documentation所说的一致:
在所有其他情况下,将参数作为浮点(实数)进行比较。
所以我的问题是......为什么要漂浮?
我可以看到尝试将数字转换为字符串(尽管上面链接的MySQL页面中的点是很好的理由)。我也可以理解抛出某种错误,或者产生警告(我的偏好)。相反,它很开心。
那么为什么要将所有东西都转换为浮动?这是从SQL标准,还是基于其他一些原因?任何人都可以为我提供这个选择吗?
答案 0 :(得分:2)
我感觉到你的痛苦。我们的数据库中有一个专栏,其中包含公司中众所周知的“订单号”。但它并不总是一个数字,在某些情况下它也可以有其他字符,所以我们将它保存在varchar中。使用SQL Server 2000,这意味着选择“order_number = 123456”是不好的。 SQL Server有效地将谓词重写为"CAST(order_number, INT) = 123456"
,这会产生两种不良影响:
order_number
上作为varchar,因此它启动完整扫描在某种程度上,我们确实拥有那些非数字“数字”,因为至少编写错误的查询会将参数作为数字传递而不仅仅是吸收资源。
我认为没有标准。我似乎记得PostgreSQL 8.3删除了数字和文本类型之间的一些默认转换,以便在计划查询时这种情况会引发错误。
据推测,“浮动”被认为是最广泛的数字类型,因此可以将所有数字默默地提升为?
哦,以及类似的问题(但没有转换错误),当你有varchar列和一个Java应用程序将所有字符串文字传递为nvarchar时...突然你的varchar索引不再使用了,祝你好运找到那个发生。当然你可以告诉Java应用程序将字符串作为varchar发送,但是现在我们只停留在windows-1252中使用字符,因为这就是5 - 6年前创建数据库时它只是一个“权宜之计解决方案” ,啊哈。
答案 1 :(得分:0)
嗯,这很容易理解:float
能够保存最大范围的数字。
例如,如果基础数据类型为datetime
,则可以简单地将其转换为具有相同内在值的浮点数。
如果数据类型是string
,则很容易将其解析为浮点数,从而降低性能。
所以float数据类型最好回退。