ส่งจาก VARCHAR ถึง INT - MySQL


267

ข้อมูลปัจจุบันของฉันสำหรับ

SELECT PROD_CODE FROM `PRODUCT`

คือ

PROD_CODE
2
5
7
8
22
10
9
11

ฉันลองค้นหาทั้งสี่ข้อแล้วและไม่ทำงานเลย ( อ้างอิง )

SELECT CAST(PROD_CODE) AS INT FROM PRODUCT;

SELECT CAST(PROD_CODE AS INT) FROM PRODUCT;

SELECT CAST(PROD_CODE) AS INTEGER FROM PRODUCT;

SELECT CAST(PROD_CODE AS INTEGER) FROM PRODUCT;

ข้อผิดพลาดทั้งหมดของไวยากรณ์การโยนเช่นด้านล่าง:

คุณมีข้อผิดพลาดในไวยากรณ์ SQL ของคุณ ตรวจสอบคู่มือที่สอดคล้องกับเวอร์ชั่นเซิร์ฟเวอร์ MySQL ของคุณเพื่อหาไวยากรณ์ที่ถูกต้องที่จะใช้ใกล้ ') ตาม INT จากข้อ จำกัด ผลิตภัณฑ์ 0, 30' ที่บรรทัด 1

คุณมีข้อผิดพลาดในไวยากรณ์ SQL ของคุณ ตรวจสอบคู่มือที่สอดคล้องกับเวอร์ชั่นเซิร์ฟเวอร์ MySQL ของคุณเพื่อหาไวยากรณ์ที่ถูกต้องใกล้กับ 'INTEGER) จาก PRODUCT LIMIT 0, 30' ที่บรรทัด 1

ไวยากรณ์ที่ถูกต้องในการแปลง varchar ถึงจำนวนเต็มใน MySQL คืออะไร?

เวอร์ชั่น MySQL: 5.5.16


ข้อผิดพลาดใดที่รายงานในแต่ละครั้ง อินพุตของคุณคืออะไร มันควรจะล้มเหลวในการค้นหาถ้านักแสดงล้มเหลวสำหรับบันทึกใด ๆ ในชุดผลลัพธ์ อย่างน้อยนั่นคือสิ่งที่มาตรฐานของ SQL บอกไว้แม้ว่า MySql จะมีชื่อเสียงในด้านความปลอดภัยในมาตรฐาน และสำหรับบันทึกข้อมูลตัวอย่างที่ 2 และ 4 นั้นถูกต้อง
Joel Coehoorn

คำตอบ:


552

ตามที่อธิบายไว้ในฟังก์ชั่น Cast และผู้ประกอบการ :

ประเภทของผลลัพธ์สามารถเป็นหนึ่งในค่าต่อไปนี้:

  • BINARY[(N)]
  • CHAR[(N)]
  • DATE
  • DATETIME
  • DECIMAL[(M[,D])]
  • SIGNED [INTEGER]
  • TIME
  • UNSIGNED [INTEGER]

ดังนั้นคุณควรใช้:

SELECT CAST(PROD_CODE AS UNSIGNED) FROM PRODUCT

7
ไม่ได้ลงชื่อกำลังทำงาน MySQL เปลี่ยนประเภทข้อมูล Integer เป็น Unsigned เมื่อใด
เลนินราช Rajasekaran

20
@emaillenin: ชนิดข้อมูลสำหรับการส่งข้อมูลไม่เหมือนกันสำหรับคอลัมน์เนื่องจากจำเป็นต้องมีข้อมูลเพิ่มเติมเกี่ยวกับวิธีการตีความข้อมูลเช่นว่าจะมีการลงชื่อจำนวนเต็มหรือไม่
eggyal

13
ขอบคุณสำหรับข้อมูลนี้ เอกสาร MySQL นั้นวุ่นวายสำหรับฉันดังนั้นสิ่งนี้จึงช่วยได้มาก
Racky

ฉันกำลังมีปัญหากับนักแสดง (num_col AS DOUBLE (10,2) .. ต่อมาฉันเปลี่ยนเป็น DECIMAL (10,2) และใช้งานได้ Tnanks
Nava Bogatee

โปรดทราบว่าใน MariaDB CAST(PROD_CODE AS INT) ทำงานได้ดี
Paul Spiegel

56

สำหรับการหล่อสาขา / ค่า varchar ให้เป็นรูปแบบตัวเลขอาจเป็นการแฮ็คเพียงเล็กน้อย:

SELECT (`PROD_CODE` * 1) AS `PROD_CODE` FROM PRODUCT`

9
ทำไมคนเราจะใช้ "แฮ็ค" เช่นนี้เมื่อมีโซลูชันที่ตรงไปตรงมารองรับและได้รับการแนะนำ?
eggyal

31
@eggyal TL; DR: "แฮ็ค" ที่คุณพูดถึงเป็นวิธีที่ตรงไปตรงมาเป็นเอกสารและแนะนำให้ใช้ - - - - - - - - - - - - - - เวอร์ชั่นยาว : จากคู่มือ : To cast a string to a number, you normally need do nothing other than use the string value in numeric contextแม้ว่าฉันจะใช้+0แทนการ*1เพิ่มเร็วกว่าก็ตาม
Mindwin

8
@BrianStinar คำตอบที่ยอมรับอย่างชัดเจนแสดงให้เห็นว่ามีวิธีแก้ปัญหาที่มีความหมายที่ดีกว่า แต่บางครั้งก็สะดวกที่ค่าดั้งเดิมจะถูกส่งไปยังปริยายอื่นโดยเฉพาะอย่างยิ่งเมื่อรวมสตริงและประเภทตัวเลข ดังนั้นการทุบตีภาษาการเขียนโปรแกรมแบบสุ่มสำหรับการมีอยู่ของคุณลักษณะนี้จึงค่อนข้างไม่เหมาะสม
B12Toaster

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