Преобразование 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') ??
динеш кандпал


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



0

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

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.