2012-08-26 93 views
175

我當前數據強制轉換爲int - MySQL的

SELECT PROD_CODE FROM `PRODUCT` 

PROD_CODE 
2 
5 
7 
8 
22 
10 
9 
11 

我已經嘗試了所有的四個查詢,沒有工作。 (Ref

SELECT CAST(PROD_CODE) AS INT FROM PRODUCT; 

SELECT CAST(PROD_CODE AS INT) FROM PRODUCT; 

SELECT CAST(PROD_CODE) AS INTEGER FROM PRODUCT; 

SELECT CAST(PROD_CODE AS INTEGER) FROM PRODUCT; 

都會拋出語法錯誤,如下面:

您的SQL語法錯誤;檢查與你的MySQL服務器版本相對應的手冊,在正確的語法上使用 在''附近')AS INT FROM PRODUCT LIMIT 0,30'at line 1

你的SQL語法錯誤;檢查 對應於「從產品LIMIT 0,30整數)」你的MySQL服務器版本正確的語法使用 接近第1行

什麼是將varchar在MySQL整數正確的語法手冊?

MySQL的版本:5.5.16

+0

它爲每次嘗試報告什麼錯誤?你的投入是什麼?如果結果集中任何記錄的轉換失敗,則認爲_supposed_失敗。至少,這就是sql標準所說的,儘管MySql以破壞標準中的安全規則而臭名昭着。而且,記錄中列出的第二和第四個樣本是正確的。 –

回答

384

如​​描述:

類型的結果可以是以下值之一:

  • BINARY[(N)]
  • CHAR[(N)]
  • DATE
  • DATETIME
  • DECIMAL[(M[,D])]
  • SIGNED [INTEGER]
  • TIME
  • UNSIGNED [INTEGER]

因此,你應該使用:

SELECT CAST(PROD_CODE AS UNSIGNED) FROM PRODUCT 
+4

未簽名正在工作。 MySQL從什麼時候將Integer數據類型更改爲Unsigned? – emaillenin

+12

@emaillenin:轉換的數據類型與列的數據類型不同,因爲有關如何解釋數據的附加信息是必需的。整數是否被簽名。 – eggyal

+8

感謝這個信息。 MySQL文檔對我來說很混亂,所以這對我有很大的幫助。 – Racky

24

鑄造VARCHAR字段/值以數字格式,可以少砍使用:

SELECT (`PROD_CODE` * 1) AS `PROD_CODE` FROM PRODUCT` 
+6

爲什麼在使用這種「黑客」 ,記錄,支持和推薦的解決方案? – eggyal

+8

@eggyal ** TL; DR:**您提到的「黑客」,是一個直接的,記錄和推薦的解決方案。 *長版本**:從[手冊](http://dev.mysql.com/doc/refman/5.7/en/cast-functions.html):'要將字符串轉換爲數字,您通常需要除了在數字上下文中使用字符串值之外,沒有其他值。儘管我使用'+ 0'而不是'* 1',因爲加法速度更快。 – Mindwin

+0

這個「推薦的解決方案」爲什麼MySQL能夠很好地與Apache和PHP結合。 –

-1

如果使用Laravel,你可以使用:

YourModel::select(DB::raw('CAST(PROD_CODE AS UNSIGNED)'))->... // under select 

或者,如果你想在where使用它

->whereRaw('CAST(reference_number AS UNSIGNED) = '.intval($value))-> 
// well, you can ignore the intval(), but it makes sense if the value you are using may be having, for example, preceding zeros e.g. 0003,