【问题标题】:Find all integers in a varchar column of a Mysql Database在 Mysql 数据库的 varchar 列中查找所有整数
【发布时间】:2013-02-08 21:07:34
【问题描述】:

这听起来很奇怪......但我需要一种方法来找出特定列中存储为整数的所有条目。

显然,过去有人在未打开 MySQL 严格模式的情况下将此列从整数转换为 varchar,这显然导致一些条目保留为整数:

作品:

SELECT * FROM inv_array where serial = 187870123

不起作用:

SELECT * FROM inv_array where serial = '187870123'

serial 列被配置为 varchar,所以上面应该可以工作,不是吗? MySQL 不应该将这些整数转换为 varchar 吗?我要疯了吗?

我需要在这个数据库中找到所有以整数形式存储序列的条目,并将它们转换为 varchar。

【问题讨论】:

  • 列不能有混合类型。它们要么都是整数,要么都是 varchars。你不能把两者混在一起。
  • @Chris 在零填充的情况下(例如,列设置为serial int(20) zerofill)是如何在例如选择查询中删除它们的问题。 SELECT trim(leading 0 FORM serial) FROM inv_array WHERE serial = 187870124.

标签: mysql


【解决方案1】:

我想您的数据有问题。假设数据存储为VARCHAR,那么上述在您的第一个查询中而不是在您的第二个查询中起作用的原因是因为 MySQL 尝试将VARCHAR 字段中的数据转换为整数以与您的第一个查询进行比较询问。它将使用所有第一个非字母字符来比较整数。

这实际上会更容易向您展示。

这是SQL Fiddle

如果您的 VARCHAR 字段中有数据(例如换行符),则第一个查询有效,因为它匹配到换行符。同样,如果您的数据是 123XYZ 并且您将其与 123 进行比较,它将被返回。这是因为 MySQL 在按整数值搜索时会将 123XYZ 转换为 123。

CREATE TABLE inv_array  (id int, serial varchar(100));
INSERT INTO inv_array VALUES (1, '123XYZ
                                 ');
SELECT * FROM inv_array where serial = 123; #returns records
SELECT * FROM inv_array where serial = '123XYZ'; #does not return any records

希望这会有所帮助。

祝你好运。

【讨论】:

  • 如果是真的,这个查询不工作吗? SELECT * FROM inv_array where serial LIKE '187870123%';它在这个数据库中不起作用。
  • 如果开头有空格则不行。尝试 SELECT * FROM inv_array where serial LIKE '%187870123%';
  • 就是这样。它出现在 LIKE '%187870123%' 中,但没有出现在下面 Pascal 的 REGEXP 语句中……我怎样才能弄清楚这东西里有什么?
  • @Chris 如果您想知道当前的列类型,您可以随时使用SHOW COLUMNS FORM inv_array 来查看列的设置方式。更改列类型时,字段内的所有内容都设置为当前格式。
  • 我知道当前的列类型,这些连续出版物的前导零似乎是它们没有出现的原因。
【解决方案2】:

您很可能在某些行中有一些空格。

你可以用这样的正则表达式找到这样的行:

带前导空格的数字

select * from inv_array where serial REGEXP ' +[0-9]+'

带空格的数字

select * from inv_array where serial REGEXP '[0-9]+ +'

【讨论】:

    【解决方案3】:

    如果它们都是 VARCHAR 并且您想搜索 INT,则可以使用 CAST 来执行此操作,而无需对数据库进行任何重大更改。

    VARCHAR 转 INT

    SELECT * FROM inv_array WHERE CAST(SERIAL_VARCHAR AS UNSIGNED) = 187870124;
    

    INT 到 VARCHAR

    SELECT * FROM inv_array_1 WHERE CAST(SERIAL_INT AS CHAR) = '187870124';
    

    对于永久解决方案,我建议更新您的表格。

    SQL FIDDLE DEMO

    如果您确实有前导零,那么您可以如何在选择查询中删除它们。 SELECT trim(leading 0 FORM serial) FROM inv_array WHERE serial = 187870124.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-10
      • 2011-06-16
      相关资源
      最近更新 更多