查找Mysql数据库的varchar列中的所有整数

时间:2013-02-08 21:07:35

标签: mysql

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

显然在过去有人将此列从整数转换为varchar而未启用MySQL严格模式,这显然导致一些条目保留为整数:

使用:

SELECT * FROM inv_array where serial = 187870123

不起作用:

SELECT * FROM inv_array where serial = '187870123'

串行列配置为varchar,所以上面应该有效,不是吗? MySQL不应该将这些整数转换为varchar吗?我疯了吗?

我需要找到这个数据库中所有的条目,其中serial被存储为整数并将它们转换为varchar。

3 个答案:

答案 0 :(得分:3)

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

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

这是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

希望这有帮助。

祝你好运。

答案 1 :(得分:1)

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

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

带前导空格的数字

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

带尾随空格的数字

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

答案 2 :(得分:0)

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

VARCHAR TO INT

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

INT TO 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