2

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

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

作品:

SELECT * FROM inv_array where serial = 187870123

不工作:

SELECT * FROM inv_array where serial = '187870123'

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

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

4

3 回答 3

3

我想你的数据有问题。假设数据存储为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

希望这可以帮助。

祝你好运。

于 2013-02-08T21:16:19.167 回答
1

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

您可以使用正则表达式找到这样的行,如下所示:

带前导空格的数字

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

带有尾随空格的数字

select * from inv_array where serial REGEXP '[0-9]+ +'
于 2013-02-08T21:23:45.600 回答
0

如果它们都是 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 小提琴演示

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

于 2013-02-08T21:35:04.513 回答