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


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

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`

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.