Prześlij int na varchar


119

Mam poniżej zapytanie i muszę przesyłać iddovarchar

Schemat

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

Co próbowałem

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

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

ale nie działają. Proszę zasugeruj.


4
Następnym razem pamiętaj, aby podać rzeczywisty komunikat o błędzie, który widzisz. To zwykle bardzo pomaga w ustaleniu, co jest nie tak. Tym razem miałeś szczęście, że wielu z nas po prostu wie, co się tutaj dzieje.
Aaron

Odpowiedzi:


218

Będziesz musiał castlub convertjako CHARtyp danych, nie ma varchartypu danych, na który możesz rzutować / konwertować dane:

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

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

Zobacz następującą instrukcję SQL - w akcji - w witrynie 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;

Oprócz faktu, że próbujesz przekonwertować dane na niepoprawny typ, składnia, której używałeś, convertbyła niepoprawna. convertFunkcja wykorzystuje następujące gdzie exprjest twoja kolumna lub wartość:

 CONVERT(expr,type)

lub

 CONVERT(expr USING transcoding_name)

Twoje pierwotne zapytanie miało odwrotną składnię.


Warto wspomnieć, że nie musisz podawać długości - zarówno rzutowanie, jak i konwersja pozwolą na coś w stylu select CAST (id as CHAR) jako col1 z t9;
Jonathan Sayce

1
@JonathanSayce To zła praktyka, aby nie używać długości, sugeruję przeczytanie Złe nawyki do kopania : deklarowanie VARCHAR bez (długość) przez Aarona Bertranda
Taryn

Ciekawy post - dzięki @bluefeet - założyłem, że w scenariuszu obsady / konwersji użyłby potrzebnego rozmiaru, a nie czegoś arbitralnego.
Jonathan Sayce

@JonathanSayce Nie jestem zbyt zaznajomiony z tajnikami MySQL i może nie używać czegoś arbitralnego, ale nie polegałbym na silniku MySQL, który jest tak inteligentny (bez obrazy dla MySQL). Aby mieć pewność, że otrzymasz odpowiednią długość, zawsze wyraźnie ją podam.
Taryn

2
@Pacerier IMO, używanie concat()do konwersji niekoniecznie jest tak intuicyjne. Wolałbym, żeby mój kod był jasny, a to po prostu nie ma sensu.
Taryn

35

Otrzymujesz to, ponieważ VARCHARnie jest to prawidłowy typ do rzutowania. Zgodnie z dokumentacją MySQL ( http://dev.mysql.com/doc/refman/5.5/en/cast-functions.html#function_cast ) możesz przesyłać tylko do:

  • BINARY [(N)]
  • CHAR [(N)]
  • DATA
  • DATETIME
  • DECIMAL [(M [, D])]
  • PODPISANO
  • [LICZBA CAŁKOWITA]
  • CZAS
  • UNSIGNED [INTEGER]

Myślę, że najlepszym rozwiązaniem jest użycie CHAR.


nie jestem pewien, ponieważ używam mysql, ale wygląda na to, że SQL zezwala na varchar stackoverflow.com/a/11989599, chociaż twoja odpowiedź jest poprawna dla mysql, dzięki.
CrandellWS

@Aaron Co jeśli moje pole to char (1), ale chcę je przekonwertować na wyliczenie ('m', 'f')?
dinesh kandpal

17

tak

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

jest postgresql, ale mySql na to nie pozwala!

skrót w mySql:

SELECT concat(id, '') FROM some_table;

1
Hej, SELECT concat (id, '') FROM some_table; to dobry hack dla MySQL, dziękuję!
Charles Cavalcante

Tak, to wszystko
George Garchagudashvili

3

Nie mam MySQL, ale są RDBMS (między innymi Postgres), w których można wykorzystać hack

SELECT id || '' FROM some_table;

Concatenate dokonuje niejawnej konwersji.


1
Postgres ma jednak jasne i zwięzłe rzutowanie „:: data_type”. Szkoda by było, gdybyśmy nie skorzystali tutaj z właściwej drogi. Mysql's concat lub +0 są uzasadnione
AdrianBR

2

Rozwiązałem problem z porównaniem całkowitej varcharkolumny z kolumną xa

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



0

Odpowiem na to ogólnie i bardzo wdzięczny powyższym współpracownikom.
Używam MySQL na MySQL Workbench. Miałem podobny problem, próbując połączyć a chari intrazem przy użyciu GROUP_CONCATmetody. Podsumowując, zadziałało dla mnie to:

powiedzmy, że masz char„c” i int„i”, więc zapytanie wygląda następująco:
...GROUP_CONCAT(CONCAT(c,' ', CAST(i AS CHAR))...


0

Powinien móc również zrobić coś takiego:

Select (id :> VARCHAR(10)) as converted__id_int
from t9 
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.