พิจารณาสองข้อความต่อไปนี้:
PRINT CONVERT(NUMERIC(38, 0), 0x0100000001, 0);
PRINT CONVERT(NUMERIC(38, 0), 0x0100010001, 0);
ทั้งสองงบกลับ-1
; ไม่ถูกต้องเนื่องจากค่าไบนารีที่สองเป็นทศนิยม 65,536 สูงกว่าค่าแรกใช่หรือไม่
แน่นอนสิ่งนี้ไม่สามารถเกิดขึ้นได้เนื่องจากการตัดทอนเงียบ
ถ้าฉันเรียกใช้คำสั่งต่อไปนี้:
PRINT CONVERT(NUMERIC(38, 0), 0x00000001, 0);
PRINT CONVERT(NUMERIC(38, 0), 0x00010001, 0);
ฉันพบข้อผิดพลาดต่อไปนี้:
Msg 8114, Level 16, State 5, Line 1
Error converting data type varbinary to numeric.
ฉันจะวินิจฉัยสิ่งที่เกิดขึ้นที่นี่ได้อย่างไร
ฉันใช้สิ่งนี้ใน SQL Server 2012, v11.0.5058 ผลลัพธ์จะเหมือนกันใน SQL Server 2008 R2 SP2, SQL Server 2005 และ SQL Server 2000
แอรอนเป็นจุด สมองของคุณกำลังแปลงข้อมูลไบนารี่เป็นข้อมูลจำนวนเต็มจากนั้นตรงไปยังตัวเลข แต่ SQL Server ไม่ได้ทำการแปลงโดยปริยายจากไบนารี่ -> จำนวนเต็ม -> ตัวเลข (x, y) สำหรับ SQL Server
—
Thomas Stringer
PRINT CONVERT(NUMERIC(38, 0), convert(int, 0x00000001), 0); PRINT CONVERT(NUMERIC(38, 0), convert(int, 0x00010001), 0);
ที่จะปฏิบัติตามกระบวนการคิดของคุณคุณจะต้องทำอะไรเช่นนี้:
ไบต์แรกคือสเกล (0x01 = 1), ไบต์ที่สองคือความแม่นยำ (0x00 = 0), ไบต์สุดท้ายคือค่า (0x01 = 1) ไม่แน่ใจว่าไบต์สามและสี่มีไว้เพื่ออะไร มีสัญญาณอยู่ในนั้น แต่ไม่ต้องการสองไบต์ การพลิกบิตนั้นดูเหมือนจะไม่ส่งผลกระทบอะไรเลย
—
Martin Smith
ขอบคุณ @MartinSmith - คุณทราบได้อย่างไรว่าในสองไบต์แรกนั้นมีการใช้งานอย่างไร มีการบันทึกไว้หรือไม่
—
Max Vernon
@AaronBertrand: คุณต้องการให้คำตอบนั้นหรือไม่? เราสามารถทำเครื่องหมายนี้ออกจากรายการ "ยังไม่ได้ตอบ"
—
จอนแห่งการค้าทั้งหมด
SELECT CONVERT(VARBINARY(32), 1), CONVERT(VARBINARY(32), 1.0);