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.


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.


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.


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;

1
Hei, PILIH concat (id, '') FROM some_table; adalah hack yang bagus untuk MySQL, terima kasih!
Charles Cavalcante


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.


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



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))...


0

Harus bisa melakukan hal seperti ini juga:

Select (id :> VARCHAR(10)) as converted__id_int
from t9 
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.