2013-02-08 69 views
2

這聽起來很奇怪......但我需要一種方法來找出存儲爲整數的特定列中的所有條目。查找Mysql數據庫的varchar列中的所有整數

顯然,在過去有人從整數轉換這一欄沒有MySQL的嚴格模式爲varchar開啓,而這顯然導致被留下作爲整數那幾個條目:

作品:

SELECT * FROM inv_array where serial = 18787

不起作用:

SELECT * FROM inv_array where serial = '187870123' 

串行列被配置爲一個varchar,所以上面應該已經工作了,沒有?不應該MySQL將這些整數作爲varchar轉換嗎?我瘋了嗎?

我需要找到這個數據庫中的所有條目,其中串行存儲爲整數並將其轉換爲varchar。

+3

一列不能有混合類型。他們都是整數,或者他們都是變種。你不能在那裏混雜兩種。 – 2013-02-08 21:12:08

+0

@Chris在zerofill的情況下(例如列被設置爲'serial int(20)zerofill')是問題所在,例如你可以在一個select查詢中移除它們。 '選擇修剪(前導0 FORM串行)從inv_array WHERE序列= 187870124'。 – 2013-02-08 22:33:50

回答

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 

希望這有助於。

祝你好運。

+0

如果這是真的,這個查詢不會工作嗎? SELECT * FROM inv_array where serial LIKE'187870123%'; 這不是在這個數據庫中工作。 – 2013-02-08 21:29:11

+0

如果開始時有空間,則不需要。嘗試SELECT * FROM inv_array where serial LIKE'%187870123%'; – bobwienholt 2013-02-08 21:30:18

+0

就是這樣。 它與LIKE'%187870123%'一起出現,但沒有出現在Pascal下面的REGEXP語句中......我怎麼才能知道這件事情是什麼? – 2013-02-08 21:42:05

1

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

你可以找到一個正則表達式這樣的行,像這樣:

數量與前導空格

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

數尾隨空格

select * from inv_array where serial REGEXP '[0-9]+ +' 
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 FIDDLE DEMO

在你有前導零的情況下,該如何,你可以在選擇查詢刪除它們。 SELECT trim(leading 0 FORM serial) FROM inv_array WHERE serial = 187870124

+0

+ 1票sgeddes。 – 2013-02-08 21:50:39

相關問題