Przesyłaj z VARCHAR do INT - MySQL

267

Moje bieżące dane dla

SELECT PROD_CODE FROM `PRODUCT`

jest

PROD_CODE
2
5
7
8
22
10
9
11

Wypróbowałem wszystkie cztery zapytania i żadne nie działało. ( 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 rzucania, takie jak poniżej:

Wystąpił błąd w składni SQL; sprawdź instrukcję, która odpowiada twojej wersji serwera MySQL, czy jest odpowiednia składnia do użycia w pobliżu ') AS INT FROM PRODUCT LIMIT 0, 30' w linii 1

Wystąpił błąd w składni SQL; sprawdź w instrukcji, która odpowiada wersji serwera MySQL, czy jest odpowiednia składnia do użycia w pobliżu „INTEGER” OD LIMITU PRODUKTU 0, 30 ”w wierszu 1

Jaka jest poprawna składnia, aby rzutować varchar na liczbę całkowitą w MySQL?

Wersja MySQL: 5.5.16

Lenin Raj Rajasekaran
źródło
Jaki błąd zgłasza przy każdej próbie? Jakie są twoje wkłady? To ma nie powieść zapytania, jeśli rzutowanie nie powiedzie się dla dowolnego rekordu w zestawie wyników. Przynajmniej tak mówi standard sql, chociaż MySql jest znany z łamania zasad bezpieczeństwa w tym standardzie. I dla przypomnienia, 2. i 4. wymienione próbki są poprawne.
Joel Coehoorn

Odpowiedzi:

552

Jak opisano w Funkcje i operatory przesyłania :

Typ wyniku może być jedną z następujących wartości:

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

Dlatego powinieneś użyć:

SELECT CAST(PROD_CODE AS UNSIGNED) FROM PRODUCT
Eggyal
źródło
7
Unsigned działa. Od kiedy MySQL zmienił typ danych Integer na Unsigned?
Lenin Raj Rajasekaran
20
@emaillenin: typy danych do rzutowania nie są takie same jak dla kolumn, ponieważ wymagane są dodatkowe informacje na temat interpretacji danych, np. czy liczby całkowite są podpisane, czy nie.
eggyal
13
Dzięki za te informacje. Dokumentacja MySQL jest dla mnie chaotyczna, więc to bardzo pomogło.
Racky,
Miałem problemy z CAST (num_col AS DOUBLE (10,2) .. Później zmieniłem go na DECIMAL (10,2) i zadziałało. Tnanks
Nava Bogatee
Pamiętaj, że w MariaDB CAST(PROD_CODE AS INT) działa dobrze.
Paul Spiegel
56

Do rzutowania pól / wartości varchar na format liczbowy można użyć małego hacka:

SELECT (`PROD_CODE` * 1) AS `PROD_CODE` FROM PRODUCT`
Jirka Kopřiva
źródło
9
Dlaczego miałoby się stosować taki „hack”, skoro istnieje proste, udokumentowane, obsługiwane i zalecane rozwiązanie?
eggyal
31
@eggyal TL; DR: wspomniany „hack” jest prostym, udokumentowanym i zalecanym rozwiązaniem. - - - - - - - - - - - - - Długa wersja : Z instrukcji : To cast a string to a number, you normally need do nothing other than use the string value in numeric contextChociaż użyłbym +0zamiast, *1ponieważ dodawanie jest szybsze.
Mindwin
8
@BrianStinar zaakceptowana odpowiedź wyraźnie pokazuje, że istnieje rozwiązanie o lepszej semantyce, ale czasami wygodne jest, że wartość pierwotna jest domyślnie rzutowana na inną wartość podstawową, szczególnie w przypadku łączenia ciągów i typów numerycznych. Tak więc przypadkowe pomieszanie języków programowania dla istnienia tej funkcji wydaje się raczej nieodpowiednie.
B12Toaster,
Nie używaj tego rodzaju hacków! - bardzo zła praktyka, która odstraszy znacznie później, gdy kod będzie pełny i trudny do przywrócenia
noce