พฤติกรรมของ Varchar มีช่องว่างในตอนท้าย


14

เมื่อฉันใช้ Varchar กับช่องว่างมันจะละเว้นช่องว่างที่ท้าย

อดีต:

declare @X varchar(50)

นี้...

set  @X= 'John'

... เหมือนกับ ...

set @X= 'John           '

มันถือว่าสิ่งเหล่านี้จะเท่ากัน ฉันจะทำให้ระบบรับรู้สิ่งเหล่านี้แตกต่างกันอย่างไร

คำตอบ:


23

ทุกอย่างเป็นไปตามมาตรฐาน 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')

ทางออกคือ

  • เพื่อใช้ฟังก์ชัน DATALENGTH เพื่อให้แตกต่างกันระหว่างสตริง
  • เพื่อแปลงสตริงเป็นประเภท NVARCHAR - อาจเป็นการดีกว่าที่จะประกาศพารามิเตอร์ประเภทนี้ของ SP

โพสต์ที่งดงามในที่สุดก็พบข้อมูลที่ดีบางอย่าง
Gaspa79

-2

คุณสามารถเพิ่มพื้นที่สีขาวให้กับสภาพของคุณ

set @X= 'John           \n'

ช่องว่างต่อท้ายในฟังก์ชั่นสตริง


5
\nไม่มีความสำคัญใน SQL Server มันไม่ได้ถูกตีความว่าเป็นบรรทัดใหม่ นี่ไม่ใช่คำตอบสำหรับคำถามที่ถามอยู่แล้ว
Martin Smith

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