Truyền int cho varchar


119

Tôi có dưới đây truy vấn và cần phải cast idđểvarchar

Lược đồ

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

Những gì tôi đã cố gắng

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

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

nhưng họ không làm việc. Xin đề nghị.


4
Lần sau hãy chắc chắn bao gồm thông báo lỗi thực tế mà bạn đang thấy. Điều đó thường giúp rất nhiều với việc tìm ra những gì sai. Lần này bạn thật may mắn khi nhiều người trong chúng ta tình cờ biết chuyện gì đang xảy ra ở đây.
Aaron

Câu trả lời:


218

Bạn sẽ cần casthoặc convertlà một CHARkiểu dữ liệu, không có varcharkiểu dữ liệu nào bạn có thể truyền / chuyển đổi dữ liệu thành:

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

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

Xem SQL sau - thực tế - tại 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;

Bên cạnh thực tế là bạn đang cố gắng chuyển đổi thành một kiểu dữ liệu không chính xác, cú pháp mà bạn đang sử dụng convertlà không chính xác. Các convertchức năng sử dụng sau đây mà exprlà cột hoặc giá trị của bạn:

 CONVERT(expr,type)

hoặc là

 CONVERT(expr USING transcoding_name)

Truy vấn ban đầu của bạn có cú pháp ngược.


Có thể đáng nói đến là bạn không phải cung cấp độ dài - cả cast và convert sẽ cho phép thứ gì đó dọc theo dòng CAST được chọn (id là CHAR) là col1 từ t9;
Jonathan Sayce

1
@JonathanSayce Thật không tốt khi không sử dụng độ dài, tôi khuyên bạn nên đọc Thói quen xấu để đá: tuyên bố VARCHAR không có (độ dài) của Aaron Bertrand
Taryn

Bài đăng thú vị - cảm ơn @bluefeet - Tôi đã giả sử trong kịch bản truyền / chuyển đổi, nó sẽ sử dụng kích thước cần thiết thay vì một cái gì đó tùy ý.
Jonathan Sayce

@JonathanSayce Tôi không quá quen thuộc với các phần mở rộng của MySQL và nó có thể không sử dụng một cái gì đó tùy tiện, nhưng tôi sẽ không dựa vào công cụ MySQL để trở nên thông minh (không vi phạm MySQL). Để chắc chắn rằng bạn có được độ dài phù hợp, tôi sẽ luôn cung cấp một cách rõ ràng.
Taryn

2
@Pacerier IMO, sử dụng concat()để thực hiện chuyển đổi không nhất thiết phải trực quan. Tôi muốn mã của tôi rõ ràng và điều đó không có ý nghĩa gì cả.
Taryn

35

Bạn đang nhận được điều đó bởi vì VARCHARkhông phải là một loại hợp lệ để tham gia. Theo tài liệu MySQL ( http://dev.mysql.com/doc/refman/5.5/en/cast-fifts.html#feft_cast ) bạn chỉ có thể truyền tới:

  • BÌNH THƯỜNG [(N)]
  • CHAR [(N)]
  • NGÀY
  • NGÀY GIỜ
  • KHAI THÁC [(M [, D])]
  • Đã ký
  • [TỔNG HỢP]
  • THỜI GIAN
  • KHÔNG ĐƯỢC KÝ [INTEGER]

Tôi nghĩ rằng đặt cược tốt nhất của bạn là sử dụng CHAR.


không chắc chắn vì tôi sử dụng mysql nhưng có vẻ như SQL cho phép varchar stackoverflow.com/a/11989599 mặc dù câu trả lời của bạn là chính xác cho mysql, cảm ơn.
CrandellWS

@Aaron Điều gì xảy ra nếu lĩnh vực của tôi là char (1) nhưng tôi muốn chuyển đổi nó thành enum ('m', 'f') ??
dinesh kandpal

17

Đúng

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

là postgresql, nhưng mySql không cho phép điều đó!

cắt ngắn trong mySql:

SELECT concat(id, '') FROM some_table;

1
Hey, CHỌN concat (id, '') TỪ some_table; là một hack tốt cho MySQL, cảm ơn bạn!
Charles Cavalcante

Vâng, chính là nó
George Garchagudashvili

3

Tôi không có MySQL, nhưng có RDBMS (Postgres, trong số những người khác) trong đó bạn có thể sử dụng hack

SELECT id || '' FROM some_table;

Các concatenate thực hiện một chuyển đổi ngầm.


1
Postgres có sự phân vai rõ ràng và súc tích, ":: data_type". Sẽ là một sự xấu hổ nếu không sử dụng cách thích hợp ở đây.
Bản tóm tắt

2

Tôi đã giải quyết một vấn đề để so sánh một cột số nguyên varcharcột với

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



0

Tôi sẽ trả lời điều này một cách chung chung, và rất biết ơn những người đóng góp ở trên.
Tôi đang sử dụng MySQL trên MySQL Workbench. Tôi đã có một vấn đề tương tự khi cố gắng nối charintsử dụng GROUP_CONCATphương thức này. Tóm lại, những gì đã làm việc cho tôi là thế này:

giả sử bạn charlà 'c' và intlà 'i', vì vậy, truy vấn trở thành:
...GROUP_CONCAT(CONCAT(c,' ', CAST(i AS CHAR))...


0

Cũng có thể làm một cái gì đó như thế này:

Select (id :> VARCHAR(10)) as converted__id_int
from t9 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.