这听起来很奇怪......但是我需要一种方法来计算特定列中存储为整数的所有条目。
显然在过去有人将此列从整数转换为varchar而未启用MySQL严格模式,这显然导致一些条目保留为整数:
使用:
SELECT * FROM inv_array where serial = 187870123
不起作用:
SELECT * FROM inv_array where serial = '187870123'
串行列配置为varchar,所以上面应该有效,不是吗? MySQL不应该将这些整数转换为varchar吗?我疯了吗?
我需要找到这个数据库中所有的条目,其中serial被存储为整数并将它们转换为varchar。
答案 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';
对于永久性解决方案,我建议更新您的表格。
如果您确实有前导零,则可以在选择查询中删除它们。
SELECT trim(leading 0 FORM serial) FROM inv_array WHERE serial = 187870124
。