【问题标题】:MySQL string cast to unsignedMySQL字符串强制转换为无符号
【发布时间】:2014-06-16 21:13:58
【问题描述】:

如果我有一个以数字开头的字符串,然后包含非数字字符,则在 MySQL 中将此字符串转换为整数将转换字符串的第一部分,并且不会表明它遇到任何问题!这很烦人。

例如:

SELECT CAST('123' AS UNSIGNED) AS WORKS,
       CAST('123J45' AS UNSIGNED) AS SHOULDNT_WORK,
       CAST('J123' AS UNSIGNED) AS DOESNT_WORK

返回:

+-------------+---------------+-------------+
|    WORKS    | SHOULDNT_WORK | DOESNT_WORK |
+-------------+---------------+-------------+
|     123     |      123      |      0      |
+-------------+---------------+-------------+

这对我来说没有任何意义,很明显,123J45 不是一个数字,当然也不等于 123。这是我的用例:

我有一个包含(一些格式错误的)邮政编码的字段。可能存在输入错误、缺少数据等,从我的角度来看,这没关系。因为另一个表将邮政编码存储为整数,所以当我加入这些表时,我需要将字符串邮政编码转换为整数(如果我采用另一种方式,我将不得不用0s 填充)。但是,如果出于某种原因有一个条目包含6023JZ1,我不可能希望将其解释为邮政编码06023。我很高兴6023JZ1 被映射到NULL。不幸的是,IF(CAST(zipcode AS UNSIGNED) <= 0, NULL, CAST(zipcode AS UNSIGNED)) 因上述问题而无法工作。

我该如何控制呢?

【问题讨论】:

  • 不是将字符串转换为整数,而是将整数转换为字符串。 Zip codes are not integers.
  • @DourHighArch,完全同意。射击首先将邮政编码存储为整数的人。您上一次需要查找邮政编码的总和或计算邮政编码的复利是什么时候?

标签: mysql string casting integer


【解决方案1】:

使用正则表达式:

select (case when val rlike '[0-9][0-9][0-9][0-9][0-9]' then cast(val as unsigned)
        end)

许多人认为 MySQL 在执行此转换时不会自动产生错误是一个不错的功能。

【讨论】:

    【解决方案2】:

    一种选择是仅测试字符串的整个长度的数字字符 0 到 9:

    zipstr REGEXP '^[0-9]+$'
    

    根据该布尔值的结果,您可以返回整数值或 NULL。

    SELECT IF(zipstr REGEXP '^[0-9]+$',zipstr+0,NULL) AS zipnum ...
    

    (注意:加零是隐式转换为数字)


    另一种选择是像您一样进行转换,并将数值转换回字符,并与原始字符串进行比较,以返回布尔值:

    CAST( zipstr+0 AS CHAR) = zipstr
    

    (注意:第二种方法确实允许使用小数点,例如

    CAST( '123.4'+0 AS CHAR ) = '123.4'  => 1
    

    如果您只是在寻找一个有效的整数,这可能是不可取的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-11
      • 2013-03-22
      • 2021-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多