Преобразование int в varchar

119

У меня есть запрос ниже, и мне нужно передать его idнаvarchar

схема

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

Что я пробовал

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

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

но они не работают. Пожалуйста, предложите.

Марио
источник
4
В следующий раз обязательно включите фактическое сообщение об ошибке, которое вы видите. Обычно это очень помогает понять, что не так. На этот раз вам повезло, что многие из нас случайно узнали, что здесь происходит.
Aaron

Ответы:

218

Вам понадобится castили convertкак CHARтип данных, нет varcharтипа данных, в который вы можете преобразовывать / преобразовывать данные:

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

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

См. Следующий SQL в действии на 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;

Помимо того факта, что вы пытались преобразовать в неправильный тип данных, синтаксис, который вы использовали, convertбыл неправильным. convertФункция использует следующее , где exprнаходится ваш столбец или значение:

 CONVERT(expr,type)

или

 CONVERT(expr USING transcoding_name)

У вашего исходного запроса был обратный синтаксис.

Тарин
источник
Возможно, стоит упомянуть, что вам не нужно указывать длину - и cast, и convert позволят что-то вроде select CAST (id as CHAR) as col1 from t9;
Jonathan Sayce
1
@JonathanSayce Не использовать длину - плохая практика, я предлагаю прочитать « Плохие привычки, от которых надо избавляться: объявление VARCHAR без (длины) » Аарон Бертран
Тарин
Интересный пост - спасибо @bluefeet - я предполагал, что в сценарии приведения / преобразования он использовал бы нужный размер, а не что-то произвольное.
Jonathan Sayce
@JonathanSayce Я не очень хорошо знаком с тонкостями MySQL, и он может не использовать что-то произвольное, но я бы не стал полагаться на движок MySQL, чтобы быть таким умным (не в обиду MySQL). Чтобы быть уверенным, что вы получаете нужную длину, я всегда предоставляю ее явно.
Тарин
2
@Pacerier IMO, использование concat()для преобразования не обязательно интуитивно понятно . Я бы предпочел, чтобы мой код был ясным, и это не имеет большого смысла.
Тарин
35

Вы получаете это, потому что VARCHARэто недопустимый тип для преобразования. В соответствии с документами MySQL ( http://dev.mysql.com/doc/refman/5.5/en/cast-functions.html#function_cast ) вы можете использовать только:

  • БИНАРНЫЙ [(N)],
  • СИМ [(N)],
  • ДАТА
  • DATETIME
  • ДЕСЯТИЧНАЯ [(М [, D])]
  • ПОДПИСАН
  • [INTEGER]
  • ВРЕМЯ
  • НЕ ПОДПИСАНО [INTEGER]

Я думаю, что лучше всего использовать CHAR.

Аарон
источник
не уверен, потому что я использую mysql, но похоже, что SQL позволяет использовать varchar stackoverflow.com/a/11989599, хотя ваш ответ правильный для mysql, спасибо.
CrandellWS
@Aaron Что делать, если мое поле - char (1), но я хочу преобразовать его в enum ('m', 'f') ??
динеш кандпал
17

да

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

это postgresql, но mySql этого не позволяет!

сокращение в mySql:

SELECT concat(id, '') FROM some_table;
Нэнси
источник
1
Привет, ВЫБЕРИТЕ concat (id, '') FROM some_table; это хороший хак для MySQL, спасибо!
Шарль Кавальканте
Да, вот и все
Георгий Гарчагудашвили
3

У меня нет MySQL, но есть СУБД (в том числе Postgres), в которых вы можете использовать хак

SELECT id || '' FROM some_table;

Объединение выполняет неявное преобразование.

Андрей Лазарь
источник
1
Postgres имеет четкое и краткое приведение типов ":: data_type". Было бы стыдно не использовать здесь правильный путь. Конкат Mysql или +0, хотя и оправданы
AdrianBR
2

Я решил проблему сравнения целочисленного столбца Column xa varcharс

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

user6348455
источник
0

использование:

SELECT cast(CHAR(50),id) as colI1 from t9;
user2132046
источник
0

Я отвечу на это в общих чертах и ​​очень благодарен перечисленным выше участникам.
Я использую MySQL в MySQL Workbench. У меня была аналогичная проблема при попытке объединить a charи an intвместе с помощью этого GROUP_CONCATметода. Таким образом, у меня сработало следующее:

допустим, у вас char'c' и int'i', поэтому запрос становится:
...GROUP_CONCAT(CONCAT(c,' ', CAST(i AS CHAR))...

HB
источник
0

Также должно быть возможно сделать что-то подобное:

Select (id :> VARCHAR(10)) as converted__id_int
from t9 
Джон Дринэйн
источник