2012-08-26 17 views
175

Moja Aktualne dane dlaOdlewanie z VARCHAR INT - MySQL

SELECT PROD_CODE FROM `PRODUCT` 

jest

PROD_CODE 
2 
5 
7 
8 
22 
10 
9 
11 

Próbowałem wszystkie cztery pytania i prace none. (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; 

Wszystkie błędy składniowe rzut takie jak poniżej:

masz błąd w składni SQL; sprawdź instrukcję, która odpowiada twojej wersji serwera MySQL dla właściwej składni, aby użyć w pobliżu ") JAK PRZED LIMITEM PRODUKTU 0, 30 'w linii 1

Wystąpił błąd w Twojej składni SQL; sprawdzić podręcznika, który odpowiada twojej serwera MySQL w wersji dla prawego składnię używaną pobliżu „Integer) Z limicie dla produktu 0, 30” at line 1

Jaka jest prawidłowa składnia rzucić varchar do liczby całkowitej w MySQL ?

MySQL wersja: 5.5.16

+0

Jaki błąd jest zgłaszany przy każdej próbie? Jakie są twoje nakłady? Jest _supposed_ na niepowodzenie zapytania, jeśli rzutowanie nie powiedzie się dla żadnego rekordu w zestawie wyników.Przynajmniej tak mówi standard SQL, chociaż MySql jest znany z łamania zasad bezpieczeństwa w standardzie. I, dla rekordu, 2 i 4 wymienione próbki są poprawne. –

Odpowiedz

384

Jak opisano Cast Functions and Operators:

typu na wynik może być jedna z następujących wartości:

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

Dlatego należy używać:

SELECT CAST(PROD_CODE AS UNSIGNED) FROM PRODUCT 
+4

Niepodpisany działa. Od kiedy MySQL zmienił typ danych Integer na Unsigned? – emaillenin

+12

@emaillenin: typy danych do rzutowania nie są takie same jak te dla kolumn, ponieważ wymagane są dodatkowe informacje dotyczące interpretacji danych, np. czy liczby całkowite są podpisane czy nie. – eggyal

+8

Dzięki za te informacje. Dokumentacja MySQL jest dla mnie chaotyczna, więc to bardzo pomogło. – Racky

24

do odlewania pola varchar/wartości do formatu liczbowego można trochę Hack używane:

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

Dlaczego ktoś użyłby takiego "hacka", gdy jest prosty? , udokumentowane, obsługiwane i zalecane rozwiązanie? – eggyal

+8

@eggyal ** TL; DR: ** "Hack", o którym wspomniałeś, jest prostym, udokumentowanym i zalecanym rozwiązaniem. - - - - - - - - - - - - - * * Long Version **: From [the manual] (http://dev.mysql.com/doc/refman/5.7/en/cast-functions.html): 'Aby rzucić ciąg na liczbę, zwykle musisz zrobić nic innego jak użyć wartości ciągu w kontekście liczbowym "Chociaż użyłbym' + 0' zamiast '* 1', ponieważ dodawanie jest szybsze. – Mindwin

+0

To" zalecane rozwiązanie ", dlaczego MySQL pasuje do Apache i PHP. –

-1

przypadku korzystania laravel, można użyć:

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

Lub jeśli chcesz użyć go w 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,