Cast dari VARCHAR ke INT - MySQL

267

Data Saya Saat Ini untuk

SELECT PROD_CODE FROM `PRODUCT`

adalah

PROD_CODE
2
5
7
8
22
10
9
11

Saya telah mencoba semua empat pertanyaan dan tidak ada yang berhasil. ( 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;

Semua kesalahan sintaksis lempar seperti di bawah ini:

Anda memiliki kesalahan dalam sintaks SQL Anda; periksa manual yang sesuai dengan versi server MySQL Anda untuk sintaks yang tepat untuk digunakan dekat ') SEBAGAI INT DARI BATAS PRODUK 0, 30' pada baris 1

Anda memiliki kesalahan dalam sintaks SQL Anda; periksa manual yang sesuai dengan versi server MySQL Anda untuk sintaks yang tepat untuk digunakan di dekat 'INTEGER) DARI BATAS PRODUK 0, 30' pada baris 1

Apa sintaks yang tepat untuk menggunakan varchar ke integer di MySQL?

Versi MySQL: 5.5.16

Lenin Raj Rajasekaran
sumber
Kesalahan apa yang dilaporkan untuk setiap upaya? Apa masukan Anda? Ini seharusnya gagal query jika pemain gagal untuk catatan dalam hasil ditetapkan. Setidaknya, itulah yang dikatakan standar sql, meskipun MySql terkenal karena melanggar aturan keselamatan dalam standar tersebut. Dan, sebagai catatan, sampel yang terdaftar 2 dan 4 sudah benar.
Joel Coehoorn

Jawaban:

552

Seperti dijelaskan dalam Fungsi dan Operator Cast :

Jenis untuk hasil dapat berupa salah satu dari nilai berikut:

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

Karena itu, Anda harus menggunakan:

SELECT CAST(PROD_CODE AS UNSIGNED) FROM PRODUCT
eggyal
sumber
7
Unsigned berfungsi. Sejak kapan MySQL mengubah tipe data Integer menjadi Unsigned?
Lenin Raj Rajasekaran
20
@emaillenin: Jenis data untuk casting tidak sama dengan yang untuk kolom, karena informasi tambahan diperlukan tentang cara menafsirkan data misalnya apakah bilangan bulat ditandatangani atau tidak.
eggyal
13
Terima kasih atas info ini. Dokumentasi MySQL kacau bagi saya jadi ini banyak membantu.
Racky
Saya mengalami masalah dengan CAST (num_col AS DOUBLE (10,2) .. Kemudian saya mengubahnya menjadi DECIMAL (10,2) dan berhasil. Tnanks
Nava Bogatee
Perhatikan bahwa pada MariaDB CAST(PROD_CODE AS INT) berfungsi dengan baik.
Paul Spiegel
57

Untuk casting bidang / nilai varchar ke format angka bisa sedikit hack digunakan:

SELECT (`PROD_CODE` * 1) AS `PROD_CODE` FROM PRODUCT`
Jirka Kopřiva
sumber
9
Mengapa orang akan menggunakan "peretasan" seperti itu ketika ada solusi yang langsung, terdokumentasi, didukung, dan direkomendasikan?
eggyal
31
@eggyal TL; DR: "retas" yang Anda sebutkan , adalah solusi yang mudah, terdokumentasi, dan direkomendasikan. - - - - - - - - - - - - - - Versi Panjang : Dari manual : To cast a string to a number, you normally need do nothing other than use the string value in numeric contextMeskipun saya akan menggunakan +0alih-alih *1karena penambahan lebih cepat.
Mindwin
8
@BrianStinar jawaban yang diterima jelas menunjukkan bahwa solusi dengan semantik yang lebih baik ada, tetapi kadang-kadang hanya nyaman bahwa nilai primitif secara implisit dilemparkan ke primitif lain, terutama ketika menggabungkan string dan tipe numerik. Jadi secara acak mem-bashing bahasa pemrograman untuk keberadaan fitur ini tampaknya agak tidak pantas.
B12Toaster
Jangan gunakan jenis peretasan ini! - praktik yang sangat buruk yang akan menggigit kembali nanti ketika kode penuh dengan ini dan sulit untuk dikembalikan
malam
dengan jawaban ini saya menemukan beberapa kali berakhir dengan float64 yang mengapa saya lebih suka menggunakanCONVERT('123456',UNSIGNED INTEGER)
Yitzchak Weingarten