MariaDB 10.3 - 使用空占位符时联合将整数转换为字符串

MariaDB 10.3 - Unions casting integers to strings when using null placeholder

我们正在使用 Laravel 8 并且最近从 10.1 更新到 MariaDB 10.3。

在某些情况下使用联合时,我现在注意到一个问题,特别是在使用占位符 select 以使列数相等时。问题是整数值被转换为字符串。它们是数据库中的无符号整数,在更改 MariaDB 版本之前这不是问题。

重现这一点的简化示例是:

dd(DB::select("(select id FROM users) union (select NULL AS id FROM users)"));

array:2 [
  0 => array:1 [
    "id" => "1"
  ]
  1 => array:1 [
    "id" => null
  ]
]

请注意,第一个元素中的 id 被强制转换为字符串。通过对此进行试验,它仅在使用 NULL AS column_name 时发生。如果我要 select 数据库中实际上是 null 的列,则不会发生这种情况。例如:

dd(DB::select("(select id FROM users) union (select parent_id FROM users)"));

array:2 [
  0 => array:1 [
    "id" => 1
  ]
  1 => array:1 [
    "id" => null
  ]
]

实际上,我在不同的 table 之间使用联合,而第二个 table 没有相同的列,这就是我使用空占位符的原因。但我认为任何想要 运行 这个查询并使用 Laravel 的人至少会有 users table.

有没有人运行以前参与过这个?我不确定实际问题出在哪里,但如前所述,这仅在升级 MariaDB 后发生。任何建议或见解将不胜感激。谢谢!

或许尝试将占位符显式转换为整数:

(SELECT id FROM users) UNION (SELECT CAST(NULL AS UNSIGNED INTEGER) AS id FROM users)

如果 UNION 的列类型不同,那么 MariaDB 会将它们隐式转换为双方都适合的类型。我推测 NULL 值的类型不明确,隐式类型转换在较新的版本中有所不同。