ตัวระบุที่ไม่ซ้ำกับอักขระพิเศษที่ยังจับคู่ในการเลือก


19

เรากำลังใช้ SQL Server 2012 ด้วยตัวระบุที่ไม่ซ้ำกันและเราสังเกตว่าเมื่อทำการเลือกด้วยอักขระเพิ่มเติมที่เพิ่มเข้ามาในตอนท้าย (ไม่ใช่ 36 ตัวอักษร) มันยังคงส่งคืนการจับคู่กับ UUID

ตัวอย่างเช่น:

select * from some_table where uuid = '7DA26ECB-D599-4469-91D4-F9136EC0B4E8' 

ส่งกลับแถวที่มี 7DA26ECB-D599-4469-91D4-F9136EC0B4E8uuid

แต่ถ้าคุณวิ่ง:

select * from some_table where uuid = '7DA26ECB-D599-4469-91D4-F9136EC0B4E8EXTRACHARS'

ก็ยังส่งกลับแถวที่มี 7DA26ECB-D599-4469-91D4-F9136EC0B4E8uuid

SQL Server ดูเหมือนจะไม่สนใจอักขระทั้งหมดที่เกิน 36 เมื่อทำการเลือก นี่เป็นข้อบกพร่อง / คุณสมบัติหรือสิ่งที่สามารถกำหนดค่าได้หรือไม่?

มันไม่ได้เป็นปัญหาใหญ่เท่าที่เรามีการตรวจสอบในส่วนหน้าสำหรับความยาว แต่ดูเหมือนว่าพฤติกรรมที่ไม่ถูกต้องสำหรับฉัน

คำตอบ:


10

{...}การแปลงโดยปริยายนอกจากนี้ยังทำงานถ้าค่าในวงเล็บปีกกา

หากคุณเพิ่มสิ่งเหล่านั้นในแบบสอบถามการแปลงโดยนัยจะล้มเหลวหากค่าเดิมยาวเกินไปเพราะสุดท้าย}จะลงในตำแหน่งที่ไม่ถูกต้อง

select * 
from some_table 
where uuid = '{'+'7DA26ECB-D599-4469-91D4-F9136EC0B4E8'+'}'

ถ้าคุณลองแปลง

SELECT CONVERT(UNIQUEIDENTIFIER, '{'+'7DA26ECB-D599-4469-91D4-F9136EC0B4E8EXTRACHARS'+'}');

คุณได้รับ

Msg 8169, Level 16, State 2, Line 1
Conversion failed when converting from a character string to uniqueidentifier.

10

SQL Server ดูเหมือนจะไม่สนใจอักขระทั้งหมดที่เกิน 36 เมื่อทำการเลือก นี่เป็นข้อบกพร่อง / คุณสมบัติหรือสิ่งที่สามารถกำหนดค่าได้หรือไม่?

ลักษณะการทำงานได้รับการบันทึกไว้ในรายการ Books Online สำหรับuniqueidentifierประเภท :

สารสกัดรายการ BOL

ตัวอย่างที่อ้างถึงคือ:

ตัวอย่าง BOL

ที่ถูกกล่าวว่าฉันชอบที่จะหลีกเลี่ยงการแปลงโดยนัย uniqueidentifierอักษรสามารถพิมพ์โดยตรงใน T-SQL โดยใช้ไวยากรณ์ ODBC หลบหนี:

DECLARE @T AS TABLE
(
    uuid uniqueidentifier UNIQUE NOT NULL
);

INSERT @T (uuid)
SELECT {guid '{7DA26ECB-D599-4469-91D4-F9136EC0B4E8}'};

SELECT t.uuid 
FROM @T AS t 
WHERE 
    t.uuid = {guid '{7DA26ECB-D599-4469-91D4-F9136EC0B4E8}'};

นี่คือไวยากรณ์เดียวกันกับ SQL Server ที่ใช้ภายในในแผนการดำเนินการเมื่อการแทนค่าสตริงให้กับการพิมพ์คงที่uniqueidentifier:

SELECT t.uuid 
FROM @T AS t 
WHERE 
    t.uuid = '7DA26ECB-D599-4469-91D4-F9136EC0B4E8';

ดัชนีค้นหา uuid

ไม่ว่าคุณจะสามารถพิมพ์ผ่านuniqueidentifiersไปยังและจาก SQL Server อาจขึ้นอยู่กับไลบรารีที่คุณใช้อยู่ แต่สตริง 36 ตัวอักษรทำให้ฉันเป็นตัวเลือกที่ต้องการน้อยที่สุด หากคุณต้องทำการแปลงให้ชัดเจนและใช้ค่าไบนารี่ 16- ไบต์แทนสตริง


9

อักขระเพิ่มเติมจะถูกละเว้นโดย SQL Server ในระหว่างการแปลงโดยนัย ตัวอย่างเช่น:

SELECT CONVERT(UNIQUEIDENTIFIER, '7DA26ECB-D599-4469-91D4-F9136EC0B4E8EXTRACHARS');

ผลลัพธ์:

------------------------------------
7DA26ECB-D599-4469-91D4-F9136EC0B4E8

นี่ไม่ได้แตกต่างจากสถานการณ์นี้:

DECLARE @x VARCHAR(1) = 'xyz';
SELECT @x;

ผลลัพธ์:

----
x  

คุณไม่สามารถกำหนดค่านี้ได้ แต่หากคุณต้องการให้ตัวแปรของคุณล้มเหลวในการแปลงคุณสามารถลองเปลี่ยนตัวแปรให้เป็นตารางที่มีลำดับCHAR(36)แรกซึ่งจะล้มเหลวเนื่องจากการตัด:

DECLARE @x TABLE(y CHAR(36));
INSERT @x SELECT '7DA26ECB-D599-4469-91D4-F9136EC0B4E8EXTRACHARS';

ผลลัพธ์:

Msg 8152, Level 16, State 14, Line 2
String or binary data would be truncated.
The statement has been terminated.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.