เมื่อฉันใช้ Varchar กับช่องว่างมันจะละเว้นช่องว่างที่ท้าย
อดีต:
declare @X varchar(50)
นี้...
set @X= 'John'
... เหมือนกับ ...
set @X= 'John '
มันถือว่าสิ่งเหล่านี้จะเท่ากัน ฉันจะทำให้ระบบรับรู้สิ่งเหล่านี้แตกต่างกันอย่างไร
เมื่อฉันใช้ Varchar กับช่องว่างมันจะละเว้นช่องว่างที่ท้าย
อดีต:
declare @X varchar(50)
นี้...
set @X= 'John'
... เหมือนกับ ...
set @X= 'John '
มันถือว่าสิ่งเหล่านี้จะเท่ากัน ฉันจะทำให้ระบบรับรู้สิ่งเหล่านี้แตกต่างกันอย่างไร
คำตอบ:
ทุกอย่างเป็นไปตามมาตรฐาน ANSI:
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
ข้อ
แต่ถ้าคุณต้องการที่จะแตกต่างพวกเขา - คุณอาจตัดสินใจที่จะใช้DATALENGTH
ฟังก์ชั่นแทนLEN
เพราะ
SELECT 1 WHERE LEN('John ') = LEN('John')
จะให้คุณ 1 แทน
SELECT 1 WHERE DATALENGTH('John ') = DATALENGTH('John')
ทางออกคือ
\n
ไม่มีความสำคัญใน SQL Server มันไม่ได้ถูกตีความว่าเป็นบรรทัดใหม่ นี่ไม่ใช่คำตอบสำหรับคำถามที่ถามอยู่แล้ว