Truyền từ VARCHAR sang INT - MySQL


267

Dữ liệu hiện tại của tôi cho

SELECT PROD_CODE FROM `PRODUCT`

PROD_CODE
2
5
7
8
22
10
9
11

Tôi đã thử tất cả bốn truy vấn và không có công việc nào. ( Tham khảo )

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 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 để biết đúng cú pháp sử dụng gần ') NHƯ INT INT TỪ GIỚI HẠN SẢN PHẨM 0, 30' tại dòng 1

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 để biết đúng cú pháp để sử dụng gần 'INTEGER) TỪ GIỚI HẠN SẢN PHẨM 0, 30' tại dòng 1

Cú pháp đúng để truyền varchar thành số nguyên trong MySQL là gì?

Phiên bản MySQL: 5.5.16


Nó báo cáo lỗi gì cho mỗi lần thử? Đầu vào của bạn là gì? Nó được cho là thất bại truy vấn nếu việc truyề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ì tiêu chuẩn sql nói, mặc dù MySql nổi tiếng là 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.
Joel Coehoorn

Câu trả lời:


552

Như được mô tả trong Cast Hàm và Toán tử :

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

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

Do đó, bạn nên sử dụng:

SELECT CAST(PROD_CODE AS UNSIGNED) FROM PRODUCT

7
Chưa ký đang làm việc. Từ khi nào, MySQL đã thay đổi kiểu dữ liệu Integer thành Unsign?
Lenin Raj Rajasekaran

20
@emaillenin: Các kiểu dữ liệu để truyền không giống với kiểu cho các cột, vì thông tin bổ sung là bắt buộc về cách diễn giải dữ liệu, ví dụ: số nguyên có được ký hay không.
eggyal

13
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

Tôi đã gặp vấn đề với CAST (num_col NHƯ NHÂN ĐÔI (10,2) .. Sau đó tôi đổi nó thành DECIMAL (10,2) và nó đã hoạt động. Tnanks
Nava Bogatee

Lưu ý rằng trên MariaDB CAST(PROD_CODE AS INT) hoạt động tốt.
Paul Spiegel

57

Để truyền các trường / giá trị varchar thành định dạng số có thể được sử dụng ít hack:

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

9
Tại sao người ta sẽ sử dụng một "hack" như vậy khi có một giải pháp đơn giản, được ghi lại, hỗ trợ và đề xuất?
eggyal

31
@eggyal TL; DR: "hack" mà bạn đang đề cập, là một giải pháp đơn giản, được ghi lại và đề xuất. - - - - - - - - - - - - - Phiên bản dài : Từ hướng dẫn sử dụng : To cast a string to a number, you normally need do nothing other than use the string value in numeric contextMặc dù tôi sẽ sử dụng +0thay vì *1kể từ khi bổ sung nhanh hơn.
Mindwin

8
@BrianStinar câu trả lời được chấp nhận cho thấy rõ ràng rằng một giải pháp có ngữ nghĩa tốt hơn tồn tại, nhưng đôi khi thật tiện lợi khi một giá trị nguyên thủy được ngầm định chuyển sang một nguyên thủy khác, đặc biệt là khi kết hợp các chuỗi và các kiểu số. Vì vậy, các ngôn ngữ lập trình bash ngẫu nhiên cho sự tồn tại của tính năng này có vẻ không phù hợp.
B12Toaster

Đừng sử dụng các loại hack này! - thực tế rất tệ sẽ cắn lại nhiều sau đó khi mã đầy những thứ này và khó hoàn nguyên
đêm

với câu trả lời này, tôi đã tìm thấy một số lần kết thúc với một float64 rằng tại sao tôi sẽ thích sử dụng hơnCONVERT('123456',UNSIGNED INTEGER)
Yitzchak Weingarten
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.