สตริงว่างเปล่า: ทำไมหรือเมื่อใดที่ '' เท่ากับ ''


17

ใครสามารถอธิบายได้ว่าทำไม

select case when '' = ' ' then 1 else 0 end, LEN(''), LEN(' '), DATALENGTH(''), DATALENGTH(' ');

อัตราผลตอบแทน

----------- ----------- ----------- ----------- -----------
1           0           0           0           1

ผลที่ตามมาของเรื่องตลกคือสิ่งต่อไปนี้

create table test ( val varchar(10) );
insert into test values( '' );
update test set val = ' ' where val = '';

การอัปเดตจะแทนที่สตริงที่ว่างเปล่าโดยช่องว่าง แต่ส่วนคำสั่งที่เก็บเป็นจริงและการประมวลผลคำสั่ง update ซ้ำ

(1 row(s) affected)

คำตอบ:


22

ช่องว่างต่อท้ายอธิบาย :

SQL Server ทำตามข้อกำหนด ANSI / ISO SQL-92 (มาตรา 8.2, กฎทั่วไป # 3) เกี่ยวกับวิธีเปรียบเทียบสตริงกับช่องว่าง มาตรฐาน ANSI ต้องการการเติมเต็มสำหรับสตริงอักขระที่ใช้ในการเปรียบเทียบเพื่อให้ความยาวตรงกันก่อนเปรียบเทียบ การขยายมีผลโดยตรงกับความหมายของคำสั่ง WHERE และ HAVING และการเปรียบเทียบสตริง Transact-SQL อื่น ๆ ตัวอย่างเช่น Transact-SQL พิจารณาสตริง 'abc' และ 'abc' ให้เทียบเท่าสำหรับการดำเนินการเปรียบเทียบส่วนใหญ่

ข้อยกเว้นสำหรับกฎนี้เท่านั้นคือเพรดิเคต LIKE เมื่อด้านขวาของนิพจน์เพรดิเคต LIKE แสดงคุณสมบัติที่มีช่องว่างต่อท้าย SQL Server จะไม่แพดสองค่าให้มีความยาวเท่ากันก่อนการเปรียบเทียบจะเกิดขึ้น เนื่องจากวัตถุประสงค์ของ LIKE predicate โดยนิยามคือเพื่ออำนวยความสะดวกในการค้นหารูปแบบมากกว่าการทดสอบความเท่าเทียมกันของสตริงอย่างง่ายนี่จึงไม่ละเมิดส่วนของข้อกำหนด ANSI SQL-92 ที่กล่าวถึงก่อนหน้านี้

นี่คือตัวอย่างที่รู้จักกันดีของกรณีทั้งหมดที่กล่าวถึงข้างต้น:

DECLARE @a VARCHAR(10)
DECLARE @b varchar(10)

SET @a = '1'
SET @b = '1 ' --with trailing blank

SELECT 1
WHERE 
    @a = @b 
AND @a NOT LIKE @b
AND @b LIKE @a

นี่คือบางส่วนรายละเอียดเพิ่มเติมเกี่ยวกับช่องว่างต่อท้ายและLIKEข้อ

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