【发布时间】:2020-09-21 06:39:46
【问题描述】:
我和我的同事今天注意到了一些奇怪的事情。如果我们这样做:
select id from table
其中id 是integer,则结果集包含整数形式的ID。一切都很好。但是,当我们这样做时:
select 1
那么结果集包含字符串"1"。导致这种情况的实际情况更复杂,涉及ifnull(),但这是重现问题的最简单的事情。
如果重要的话,我们会使用 NodeJS (+Typescript) 和 TypeORM。我记得在 PHP 中也注意到了类似的东西,但是由于 PHP 对类型的要求太宽松了,所以我不太在意。然而这次我们将数据作为 JSON 传递到外部系统,所以现在我们需要添加 parseInt() 以便将字符串类型的数字转换回实际数字。
但是 - wtf?为什么会有这种行为?
【问题讨论】:
-
为什么会有这种行为? MySQL 没有任何标记可以确定结果集列的数据类型是否必须是数字。所以它使用最常见的数据类型,即字符串一。如果您需要数字数据类型,请严格使列上下文具有确定性,例如
SELECT 1 + 0。 -
@ÁlvaroGonzález 我认为 HeidiSQL 使用与 JScript 相同的 ODBC 驱动程序...
-
@Akina - 我认为数字文字
1有点暗示数字类型...我可以理解它可能会混淆选择哪种特定类型而不是字符串... -
@Akina 我实际上误读了这个问题。这基本上就是你所说的,MySQL 设置它认为合适的数据类型。在处理计算列时,我有时不得不使用
CAST(),即使源值只是小数操作。 -
@ÁlvaroGonzález - 这很奇怪 - 即使
cast(1 as integer)变成了一个字符串......
标签: mysql mariadb sqldatatypes