Transmisikan int ke varchar

119

Saya memiliki kueri di bawah ini dan perlu melakukan cast idkevarchar

Skema

create table t9 (id int, name varchar (55));
insert into t9( id, name)values(2, 'bob');

Apa yang saya coba

select CAST(id as VARCHAR(50)) as col1 from t9;

select CONVERT(VARCHAR(50),id) as colI1 from t9;

tapi tidak berhasil. Mohon saran.

Mario
sumber
4
Lain kali pastikan untuk memasukkan pesan kesalahan sebenarnya yang Anda lihat. Itu biasanya sangat membantu untuk mencari tahu apa yang salah. Kali ini Anda beruntung karena banyak dari kami yang kebetulan tahu apa yang terjadi di sini.
Aaron

Jawaban:

218

Anda akan memerlukan castatau convertsebagai CHARtipe data, tidak ada varchartipe data yang Anda dapat mentransmisikan / mengonversi data ke:

select CAST(id as CHAR(50)) as col1 
from t9;

select CONVERT(id, CHAR(50)) as colI1 
from t9;

Lihat SQL berikut - beraksi - di SQL Fiddle :

/*! Build Schema */
create table t9 (id INT, name VARCHAR(55));
insert into t9 (id, name) values (2, 'bob');

/*! SQL Queries */
select CAST(id as CHAR(50)) as col1 from t9;
select CONVERT(id, CHAR(50)) as colI1 from t9;

Selain fakta bahwa Anda mencoba mengonversi ke tipe data yang salah, sintaks yang Anda gunakan untuk convertsalah. The convertFungsi menggunakan berikut mana expryang Anda kolom atau nilai:

 CONVERT(expr,type)

atau

 CONVERT(expr USING transcoding_name)

Kueri asli Anda memiliki sintaks mundur.

Taryn
sumber
Mungkin perlu disebutkan bahwa Anda tidak harus memberikan panjangnya - baik cast maupun convert akan memungkinkan sesuatu di sepanjang baris pilih CAST (id as CHAR) sebagai col1 dari t9;
Jonathan Sayce
1
@JonathanSayce Ini adalah praktik yang buruk untuk tidak menggunakan panjang, saya sarankan membaca Kebiasaan buruk untuk menendang: menyatakan VARCHAR tanpa (panjang) oleh Aaron Bertrand
Taryn
Posting menarik - terima kasih @bluefeet - Saya berasumsi dalam skenario cast / convert itu akan menggunakan ukuran yang dibutuhkannya daripada sesuatu yang sewenang-wenang.
Jonathan Sayce
@JonathanSayce Saya tidak terlalu akrab dengan seluk beluk MySQL dan mungkin tidak menggunakan sesuatu yang sewenang-wenang, tetapi saya tidak akan mengandalkan mesin MySQL untuk menjadi pintar (tidak menyinggung MySQL). Untuk memastikan Anda mendapatkan panjang yang tepat, saya akan selalu menyediakannya secara eksplisit.
Taryn
2
@Pacerier IMO, menggunakan concat()untuk melakukan konversi belum tentu begitu intuitif. Saya lebih suka kode saya jelas dan itu tidak masuk akal.
Taryn
35

Anda mendapatkannya karena VARCHARbukan tipe yang valid untuk ditransmisikan. Menurut dokumen MySQL ( http://dev.mysql.com/doc/refman/5.5/en/cast-functions.html#function_cast ) Anda hanya dapat mentransmisikan ke:

  • BINER [(N)]
  • CHAR [(N)]
  • TANGGAL
  • TANGGAL WAKTU
  • DESIMAL [(M [, D])]
  • TERTANDA
  • [BILANGAN BULAT]
  • WAKTU
  • TIDAK DITANDATANGANI [INTEGER]

Saya pikir taruhan terbaik Anda adalah menggunakan CHAR.

Aaron
sumber
tidak yakin karena saya menggunakan mysql tetapi tampaknya SQL memungkinkan varchar stackoverflow.com/a/11989599 meskipun jawaban Anda benar untuk mysql, terima kasih.
CrandellWS
@Aaron Bagaimana jika field saya adalah char (1) tetapi saya ingin mengubahnya menjadi enum ('m', 'f') ??
dinesh kandpal
17

Iya

SELECT id || '' FROM some_table;
or SELECT id::text FROM some_table;

adalah postgresql, tetapi mySql tidak mengizinkannya!

jalan pintas di mySql:

SELECT concat(id, '') FROM some_table;
Nancy
sumber
1
Hei, PILIH concat (id, '') FROM some_table; adalah hack yang bagus untuk MySQL, terima kasih!
Charles Cavalcante
Ya, itu dia
George Garchagudashvili
3

Saya tidak memiliki MySQL, tetapi ada RDBMS (Postgres, antara lain) tempat Anda dapat menggunakan peretasan

SELECT id || '' FROM some_table;

Rangkaian melakukan konversi implisit.

Andrew Lazarus
sumber
1
Postgres memiliki casting yang jelas dan ringkas, ":: data_type". Sayang sekali tidak menggunakan cara yang tepat di sini.
Concat
2

Aku memecahkan masalah untuk membandingkan bilangan bulat Kolom xa varcharkolom dengan

where CAST(Column_name AS CHAR CHARACTER SET latin1 ) collate latin1_general_ci = varchar_column_name

pengguna6348455
sumber
0

gunakan:

SELECT cast(CHAR(50),id) as colI1 from t9;
pengguna2132046
sumber
0

Saya akan menjawab ini secara umum, dan sangat berterima kasih kepada kontributor di atas.
Saya menggunakan MySQL di MySQL Workbench. Saya memiliki masalah serupa saat mencoba menggabungkan a chardan intbersama menggunakan GROUP_CONCATmetode ini. Singkatnya, apa yang berhasil untuk saya adalah ini:

katakanlah Anda charadalah 'c' dan int'i', jadi, kueri menjadi:
...GROUP_CONCAT(CONCAT(c,' ', CAST(i AS CHAR))...

HB
sumber
0

Harus bisa melakukan hal seperti ini juga:

Select (id :> VARCHAR(10)) as converted__id_int
from t9 
John Drinane
sumber