ส่ง int เป็น varchar


119

ฉันมีคำถามด้านล่างและจำเป็นต้องส่งidถึงvarchar

schema

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)

ข้อความค้นหาเดิมของคุณมีไวยากรณ์ย้อนหลัง


อาจคุ้มค่าที่จะกล่าวถึงว่าคุณไม่จำเป็นต้องระบุความยาว - ทั้งการแคสต์และการแปลงจะอนุญาตให้บางสิ่งตามบรรทัดของแคสต์ที่เลือก (id as CHAR) เป็น col1 จาก t9;
Jonathan Sayce

1
@JonathanSayce เป็นการปฏิบัติที่ไม่ดีที่จะไม่ใช้ความยาวฉันขอแนะนำให้อ่านนิสัยที่ไม่ดีในการเตะ: การประกาศ VARCHAR โดยไม่มี (ความยาว)โดยAaron Bertrand
Taryn

โพสต์ที่น่าสนใจ - ขอบคุณ @bluefeet - ฉันคิดว่าในสถานการณ์การแคสต์ / การแปลงมันจะใช้ขนาดที่ต้องการมากกว่าบางอย่างโดยพลการ
Jonathan Sayce

@JonathanSayce ฉันไม่คุ้นเคยกับรายละเอียดปลีกย่อยของ MySQL มากเกินไปและอาจไม่ใช้บางสิ่งบางอย่างตามอำเภอใจ แต่ฉันจะไม่พึ่งพาเอ็นจิ้น MySQL ที่ฉลาด (ไม่มีความผิดต่อ MySQL) เพื่อให้แน่ใจว่าคุณมีความยาวที่เหมาะสมฉันจะระบุอย่างชัดเจนเสมอ
Taryn

2
@Pacerier IMO การใช้concat()เพื่อทำการแปลงไม่จำเป็นต้องใช้งานง่าย ฉันต้องการให้รหัสของฉันชัดเจนและมันก็ไม่สมเหตุสมผล
Taryn

35

คุณได้รับสิ่งนั้นเนื่องจากVARCHARไม่ใช่ประเภทที่ถูกต้องในการส่ง ตามเอกสาร MySQL ( http://dev.mysql.com/doc/refman/5.5/en/cast-functions.html#function_cast ) คุณสามารถส่งไปที่:

  • BINARY [(N)]
  • CHAR [(N)]
  • วันที่
  • วันเวลา
  • ทศนิยม [(M [D])]
  • ลงนาม
  • [จำนวนเต็ม]
  • เวลา
  • ไม่ได้ลงนาม [INTEGER]

CHARผมคิดว่าดีที่สุดเดิมพันของคุณคือการใช้


ไม่แน่ใจเพราะฉันใช้ mysql แต่ดูเหมือนว่า SQL อนุญาตให้ varchar stackoverflow.com/a/11989599แม้ว่าคำตอบของคุณจะถูกต้องสำหรับ mysql ขอบคุณ
CrandellWS

@Aaron จะเกิดอะไรขึ้นถ้าฟิลด์ของฉันเป็น char (1) แต่ฉันต้องการแปลงเป็น enum ('m', 'f') ??
dinesh kandpal

17

ใช่

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

คือ postgresql แต่ mySql ไม่อนุญาต!

ตัดสั้นใน mySql:

SELECT concat(id, '') FROM some_table;

1
สวัสดี SELECT concat (id, '') จาก some_table; เป็นแฮ็คที่ดีสำหรับ MySQL ขอบคุณ!
Charles Cavalcante

ใช่แล้ว
George Garchagudashvili

3

ฉันไม่มี MySQL แต่มี RDBMS (Postgres และอื่น ๆ ) ที่คุณสามารถใช้แฮ็คได้

SELECT id || '' FROM some_table;

การเชื่อมต่อกันจะทำการแปลงโดยปริยาย


1
Postgres มีการแคสต์ที่ชัดเจนและกระชับว่า ":: data_type" จะน่าเสียดายที่ไม่ใช้วิธีที่เหมาะสมที่นี่
Concat

2

ฉันแก้ไขปัญหาในการเปรียบเทียบคอลัมน์จำนวนเต็มคอลัมน์ xa varcharกับ

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



0

ฉันจะตอบคำถามนี้โดยทั่วไปและขอขอบคุณผู้มีส่วนร่วมข้างต้น
ฉันใช้ MySQL บน MySQL Workbench ฉันมีปัญหาคล้ายกันที่พยายามเชื่อมต่อ a charและintเข้าด้วยกันโดยใช้GROUP_CONCATวิธีนี้ โดยสรุปสิ่งที่ได้ผลสำหรับฉันคือสิ่งนี้

สมมติว่าคุณcharคือ 'c' และintเป็น 'i' ดังนั้นข้อความค้นหาจึงกลายเป็น:
...GROUP_CONCAT(CONCAT(c,' ', CAST(i AS CHAR))...


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.