สาเหตุของปัญหานี้กับ CONVERT () คืออะไร


12

พิจารณาสองข้อความต่อไปนี้:

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


4
ทศนิยมและตัวเลขทั้งหมดถูกเข้ารหัสแตกต่างกันมากใน varbinary ทศนิยมต้องการพื้นที่เพิ่มขึ้น ลองSELECT CONVERT(VARBINARY(32), 1), CONVERT(VARBINARY(32), 1.0);
Aaron Bertrand

4
แอรอนเป็นจุด สมองของคุณกำลังแปลงข้อมูลไบนารี่เป็นข้อมูลจำนวนเต็มจากนั้นตรงไปยังตัวเลข แต่ SQL Server ไม่ได้ทำการแปลงโดยปริยายจากไบนารี่ -> จำนวนเต็ม -> ตัวเลข (x, y) สำหรับ SQL Server PRINT CONVERT(NUMERIC(38, 0), convert(int, 0x00000001), 0); PRINT CONVERT(NUMERIC(38, 0), convert(int, 0x00010001), 0);ที่จะปฏิบัติตามกระบวนการคิดของคุณคุณจะต้องทำอะไรเช่นนี้:
Thomas Stringer

5
ไบต์แรกคือสเกล (0x01 = 1), ไบต์ที่สองคือความแม่นยำ (0x00 = 0), ไบต์สุดท้ายคือค่า (0x01 = 1) ไม่แน่ใจว่าไบต์สามและสี่มีไว้เพื่ออะไร มีสัญญาณอยู่ในนั้น แต่ไม่ต้องการสองไบต์ การพลิกบิตนั้นดูเหมือนจะไม่ส่งผลกระทบอะไรเลย
Martin Smith

1
ขอบคุณ @MartinSmith - คุณทราบได้อย่างไรว่าในสองไบต์แรกนั้นมีการใช้งานอย่างไร มีการบันทึกไว้หรือไม่
Max Vernon

3
@AaronBertrand: คุณต้องการให้คำตอบนั้นหรือไม่? เราสามารถทำเครื่องหมายนี้ออกจากรายการ "ยังไม่ได้ตอบ"
จอนแห่งการค้าทั้งหมด

คำตอบ:


2

ทศนิยมและตัวเลขทั้งหมดถูกเข้ารหัสแตกต่างกันมากใน varbinary ทศนิยมต้องการพื้นที่เพิ่มขึ้น ลอง:

SELECT CONVERT(VARBINARY(32), 1), CONVERT(VARBINARY(32), 1.0);

สำหรับเป้าหมายสูงสุดของคุณการจัดเก็บตัวเลขทั้งหมดเป็น varbinary เพื่อประหยัดพื้นที่ฉันคิดว่าคุณตอบคำถามด้วยตัวคุณเอง - ไม่คุ้มค่า

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