2012-08-26 35 views
175

My dữ liệu hiện tại choCast từ VARCHAR để INT - MySQL

SELECT PROD_CODE FROM `PRODUCT` 

PROD_CODE 
2 
5 
7 
8 
22 
10 
9 
11 

Tôi đã thử tất cả bốn câu hỏi và làm việc không. (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; 

Tất cả các lỗi cú pháp ném như dưới đây:

Bạn có một lỗi trong cú pháp SQL của bạn; kiểm tra hướng dẫn tương ứng với phiên bản máy chủ MySQL của bạn để có cú pháp đúng để sử dụng gần ') AS INT FROM PRODUCT LIMIT 0, 30' tại dòng 1

Bạn có lỗi trong cú pháp SQL; kiểm tra hướng dẫn rằng tương ứng với phiên bản máy chủ MySQL của bạn cho đúng cú pháp để sử dụng gần 'INTEGER) từ sản phẩm LIMIT 0, 30' tại dòng 1

đúng cú pháp để cast varchar để nguyên trong MySQL là gì ?

MySQL Version: 5.5.16

+0

Báo cáo lỗi nào cho mỗi lần thử? Đầu vào của bạn là gì? Đó là _supposed_ để không truy vấn nếu dàn diễn viên không thành công cho bất kỳ bản ghi nào trong tập kết quả.Ít nhất, đó là những gì các tiêu chuẩn sql nói, mặc dù MySql là nổi tiếng cho vi phạm các quy tắc an toàn trong tiêu chuẩn. Và, đối với hồ sơ, các mẫu được liệt kê thứ 2 và thứ 4 là chính xác. –

Trả lời

384

Như đã trình bày trong Cast Functions and Operators:

Loại cho kết quả có thể là một trong những giá trị sau:

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

Vì vậy, bạn nên sử dụng:

SELECT CAST(PROD_CODE AS UNSIGNED) FROM PRODUCT 
+4

Unsigned đang hoạt động. Từ khi nào MySQL đã thay đổi kiểu dữ liệu Integer thành Unsigned? – emaillenin

+12

@emaillenin: Các loại dữ liệu để truyền không giống như các loại dữ liệu cho cột, vì thông tin bổ sung được yêu cầu về cách diễn giải dữ liệu, ví dụ: liệu các số nguyên có được ký hay không. – eggyal

+8

Cảm ơn thông tin này. Tài liệu MySQL là hỗn loạn đối với tôi vì vậy điều này đã giúp rất nhiều. – Racky

24

Đối đúc lĩnh vực varchar/giá trị sang định dạng số có thể được ít hack được sử dụng:

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

Tại sao sẽ sử dụng "hack" như vậy – eggyal

+8

@eggyal ** TL; DR: ** "hack" bạn đang đề cập đến, là một giải pháp đơn giản, được tài liệu và được đề xuất. - - - - - - - - - - - - - * * Phiên bản dài **: Từ [hướng dẫn] (http://dev.mysql.com/doc/refman/5.7/en/cast-functions.html): 'Để truyền một chuỗi tới một số, bạn thường cần làm không có gì khác hơn là sử dụng giá trị chuỗi trong ngữ cảnh số' Mặc dù tôi muốn sử dụng '+ 0' thay vì' * 1' vì phần bổ sung nhanh hơn – Mindwin

+0

"giải pháp được đề xuất" này tại sao MySQL hoạt động tốt với Apache và PHP. –

-1

Nếu sử dụng Laravel, bạn có thể sử dụng:

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

Hoặc nếu bạn muốn sử dụng nó trong một 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, 
Các vấn đề liên quan