代码之家  ›  专栏  ›  技术社区  ›  MBCook

MySQL类型转换:为什么float是最小公分母类型?

  •  1
  • MBCook  · 技术社区  · 15 年前

    我最近遇到了一个问题,一个查询导致了一个完整的表扫描,它归结为一个列有一个不同的定义,我认为它是一个VARCHAR而不是INT。当使用“string_column=17”查询时,它无法使用索引。那真让我大吃一惊。

    所以我去搜索,发现发生了什么,我看到的行为与我所看到的一致 MySQL's documentation

    在所有其他情况下,参数作为浮点(实数)数进行比较。

    所以我的问题是。。。为什么是浮子?

    那么,为什么要将所有内容都转换为浮动呢?这是来自SQL标准,还是基于其他原因?有人能为我解释一下这个选择吗?

    2 回复  |  直到 15 年前
        1
  •  2
  •   araqnid    15 年前

    我感觉到你的痛苦。我们的数据库中有一列,其中包含公司中众所周知的“订单号”。但它并不总是一个数字,在某些情况下它也可以有其他字符,所以我们把它保存在varchar中。对于SQL Server 2000,这意味着选择“订单号=123456”是错误的。SQL Server有效地将谓词重写为 "CAST(order_number, INT) = 123456" 这有两个不良影响:

    1. 索引已打开 order_number
    2. 这些非数字订单号最终会导致向用户抛出一个转换错误,并显示一条毫无帮助的消息。

    在某种程度上,我们确实有那些非数字的“数字”是好事,因为至少写得不好的以数字形式传递参数的查询会被捕获,而不仅仅是占用资源。

    我认为没有标准。我似乎记得PostgreSQL 8.3删除了数字和文本类型之间的一些默认强制转换,因此这种情况在计划查询时会抛出错误。

    哦,还有类似的问题(但没有转换错误),当您有varchar列和一个将所有字符串文本作为nvarchar传递的Java应用程序时。。。突然,您的varchar索引不再被使用,祝您好运找到发生这种情况的地方。当然,你可以告诉Java应用程序以varchar的形式发送字符串,但是现在我们只能在windows-1252中使用字符,因为这就是5-6年前创建的DB,当时它只是一个“权宜之计”,啊哈。

        2
  •  0
  •   Paulo Santos    15 年前

    float 能够容纳最大范围的数字。

    如果基础数据类型为 datetime

    如果数据类型是 string