mysql中的类型转换层次结构是什么?

mysql中的类型转换层次结构是什么?,mysql,sql,casting,union,Mysql,Sql,Casting,Union,以以下为例: WITH tbl as ( select 1, 1e2, 1.2e-4, 1.235, null, 0b01, if(1=1, 1, 2) union select 1, 1e2, 1.2e-4, 1.235, null, 0b01, if(1=1, 1, 2.4) union select 1, 1e2, 1.2e-4, 1.235, null, 0b01, if(1=1, 1, 'a') ) select * from tbl 如果我只在cte中包含第

以以下为例:

WITH tbl as (
    select 1, 1e2, 1.2e-4, 1.235, null, 0b01, if(1=1, 1, 2) union
    select 1, 1e2, 1.2e-4, 1.235, null, 0b01, if(1=1, 1, 2.4) union
    select 1, 1e2, 1.2e-4, 1.235, null, 0b01, if(1=1, 1, 'a')
)
select * from tbl
如果我只在cte中包含第一条select语句,则类型将为int。如果我包含第一条和第二条,则类型将为DECIMAL,如果我包含所有三条,则无论三条语句的位置如何,类型都将转换为VARCHAR

mysql如何确定将其强制转换到哪个类型?在哪里可以找到“类型层次结构”?大多数其他DBMS处理这一问题的方式相同,还是不同?

union All查询的所有成员都必须具有匹配的列数据类型:在编写查询的方式中,datatabse需要决定最后一列应使用哪种数据类型

mysql如何确定将其强制转换到哪个类型?我在哪里可以找到“typer层次结构”

当被要求比较不同数据类型的值时,MySQL会经历一个启发式过程,juergen d对此进行了评论。简言之,如果混合使用数字和字符串,它们最终将作为浮点数进行比较。这是列表中的最后一个要点,有点像是包罗万象:

在所有其他情况下,参数作为浮点实数进行比较。例如,字符串和数字操作数的比较是作为浮点数的比较进行的。 你还问:

大多数其他DBMS处理这个问题的方式是相同的,还是各不相同

并非所有数据库都具有相同的决策树。还有一些情况下,您的语句可能会失败,因为不一致的数据类型Postgres就是一个例子


外卖:不要依赖于单独的、简单的、明确的情况下的隐式转换。了解您的数据类型,并在需要时对适当的数据类型执行显式转换。这使得查询更加明确地说明了它应该做什么,并为您以及代码的未来读者和维护者节省了记住数据库隐式强制转换规则的负担。

首先,要问关于其他数据库的问题,您需要使用标准SQL来表达SQL—即使用大小写表达式,而不是在以下情况下:

在几乎任何数据库中,第三行都会生成错误。case表达式有两条路径,一条返回int,另一条返回字符串。根据标准SQL的规则,case表达式的类型是int,您会得到一个类型转换错误。表达式的类型与返回的值无关

然而,MySQL与标准不同。在本例中,它允许类型为字符串

工会也发生了类似的事情。它验证类型是否兼容并确定适当的类型。因为大多数数据库都会为第三个子查询返回错误,所以在这种情况下,类型转换是不相关的

但是,当你考虑前两个时,它是相关的。前两个int与numeric/decimal的类型不同。它们通常是兼容的,因此numeric/decimal是从union返回的类型,并且没有错误

我应该注意到有些数据库会耍花招。例如,SQL Server将允许您的代码,但它将返回一个十进制数。为什么?它在解析阶段消除了大小写表达式,因此它从不考虑返回字符串。也就是说,如果使用1=0,将生成一个错误

with tbl as (
    select 1, 1e2, 1.2e-4, 1.235, null, 0b01, (case when 1=1 then 1 else 2 end) union
    select 1, 1e2, 1.2e-4, 1.235, null, 0b01, (case when 1=1 then 1 else 2.4 end) union
    select 1, 1e2, 1.2e-4, 1.235, null, 0b01, (case when 1=1 then 1 else 'a' end)
)
select * from tbl;