【问题标题】:Mysql: How to cast to integer while avoiding 'Truncated incorrect INTEGER value' for non-numeric valuesMysql:如何在避免非数字值的“截断不正确的整数值”的同时转换为整数
【发布时间】:2017-10-21 22:48:48
【问题描述】:

在将字符串转换为整数值时,MySQL 中的 castconvert 函数都会抛出“截断不正确的 INTEGER 值”:

select cast(mycolumn as unsigned) from mytable;

我想了解 PHP 和大多数其他编程语言的行为,这意味着我想将所有非数字字符串强制转换为零。

在 MySQL 中最有效的方法是什么?

【问题讨论】:

  • “我想获得 PHP 和大多数其他编程语言的行为,这意味着我想将所有非数字字符串强制转换为零。”我希望您尝试 C 或 C# 中的 int x = "Hello"; 或 Python 中的 int("Hello"),看看您会得到什么。许多编程语言都是静态类型的,或者不允许无效的类型转换。您可能整天都在使用 PHP 和 JavaScript,但这并不意味着当您进行错误类型转换时会静默修改数据的动态类型语言是默认语言。
  • @BaconBits:说句公道话,这是atoi和C/C++中一些相关函数的行为。
  • @DavisHerring 是的,但这并不是真正的类型转换,CAST()CONVERT() 就是这样。 C 类型转换为(int) 'Hello'atoi 有一种特殊的算法可以故意丢弃数据。

标签: mysql


【解决方案1】:

作为任何发现此问题的人的参考:

如果您有 MariaDB 10.0.5+ 或 MySQL 8+,则可以使用 REGEXP_SUBSTR() 函数仅保留字符串的前几位。

SELECT REGEXP_SUBSTR('123foo', '^\\d+');
-> 123

注意:这与 CAST() 不同,因为 'foo123' 的结果是 '' 而不是 0。

【讨论】:

    【解决方案2】:

    这是 mysql 的行为,坦率地说,您对此无能为力。虽然,请注意,在 select 语句中,即使您处于严格的 sql 模式,您也只会收到警告,而不是错误。因此,选择查询会产生您期望的输出,您只会收到警告。

    但是,如果您想在更新语句中使用它,那么您需要关闭严格的 sql 模式 - 甚至更好:您应该重新考虑您的逻辑以避免将文本转换为数字。

    【讨论】:

    • @rolandseuhs:确实。如果你有一个 char(x) 列并且它包含数字,为什么它不是以数字列开头?
    【解决方案3】:

    如果您想摆脱该警告,请尝试以下类似操作(虽然不是必需的)

    select if(mycolumn regexp '[^0-9]',0,cast(mycolumn as unsigned));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-30
      • 2022-11-27
      • 1970-01-01
      • 1970-01-01
      • 2019-07-20
      • 2012-11-04
      • 1970-01-01
      相关资源
      最近更新 更多