ปัญหานี้สามารถแก้ไขได้โดยใช้การเปรียบเทียบที่ไม่ถูกต้อง
ฐานข้อมูลของคุณอาจใช้การเปรียบเทียบ AS (การเน้นข้อความที่มีความสำคัญ) ดังนั้นโดยค่าเริ่มต้นมันจะค้นหาการจับคู่ที่ตรงกันรวมถึงการเน้น
คุณสามารถแนะนำส่วนคำสั่ง WHERE ที่จะใช้การเปรียบเทียบใหม่กว่าฐานข้อมูลเริ่มต้นโดยการระบุการเปรียบเทียบกับการเปรียบเทียบ
ในdbfiddle นี้ฉันสร้างตัวอย่างโดยใช้การเปรียบเทียบ LATIN1 แต่คุณสามารถใช้วิธีการเดียวกันกับการเปรียบเทียบที่คุณกำลังใช้เพียงแค่เปลี่ยน AS เป็น AI สำหรับการเรียงคอลัมน์ที่คอลัมน์ของคุณกำลังใช้อยู่
ใช้การจัดเรียง Accent Insensitive ที่ตรงกับการเรียงที่ colummn ใช้ ตัวอย่างเช่นหากคอลัมน์กำลังใช้SQL_Latin1_General_CP1_CI_AS
ใช้SQL_Latin1_General_CP1_CI_AI
และไม่Latin1_General_CI_AS
หรือLatin1_General_100_CI_AS
รูปแบบใด ๆ ของทั้งสองนั้นเนื่องจากพฤติกรรมของการเปรียบเทียบที่ไม่ใช่ SQL_ จะแตกต่างกันไปในหลาย ๆ ทางมากกว่าการใช้สำเนียงที่เน้นความรู้สึกและอาจไม่คาดหวังจากผู้ใช้
sys.columns
คุณสามารถตรวจสอบเปรียบเทียบในปัจจุบัน
CREATE TABLE testaccent (name nvarchar(50));
GO
INSERT INTO testaccent (name) VALUES ('Millière') , ('Milliere');
GO
-- returns Miliere
SELECT * FROM testaccent WHERE name = 'Milliere';
-- returns both
SELECT * FROM testaccent WHERE name='Milliere' COLLATE Latin1_General_CI_AI
--only returns Miliere
SELECT * FROM testaccent WHERE name='Milliere' COLLATE Latin1_General_CI_AS
อ่านผ่านการใช้ SQL Server Collationsสำหรับข้อมูลเพิ่มเติม
จากนั้นอีกครั้งคุณอาจต้องการเรียงลำดับเพื่อใช้การเปรียบเทียบนี้ (ตามที่peufeuระบุไว้ในความคิดเห็น) เพื่อให้แน่ใจว่า "é" เรียงลำดับด้วย "e" มิฉะนั้นคนที่เลขหน้าในผลลัพธ์ตามลำดับตัวอักษรจะแปลกใจที่จะไม่พบ "é" ที่พวกเขาคาดหวังว่าพวกเขาจะเป็น แต่ถ้าคุณเพียงแค่ต้องการสัมผัสแบบสอบถามนี้คุณสามารถเพิ่มส่วนCOLLATE
คำสั่งได้ORDER BY
เช่นกัน
ตามที่ระบุไว้โดยSolomon Rutzkyในความคิดเห็นหากสิ่งนี้มีผลกับ 1 หรือคอลัมน์ไม่กี่ตัวเลือกอื่นคือการสร้างคอลัมน์ที่ไม่ได้คำนวณที่ยังคงอยู่ซึ่งเพียงแค่ทำซ้ำคอลัมน์ "ชื่อ" และให้การเรียงแบบเน้นเสียงแบบอ่อน คอลัมน์. หลีกเลี่ยงการสแกนที่เกิดจากการเปลี่ยนการเรียงภายในแบบสอบถาม ดังนั้นแบบสอบถามจำเป็นต้องกรองในคอลัมน์ใหม่
สิ่งที่ต้องการ:
ALTER TABLE
dbo.[table_name] ADD [SearchName] datatype_of_name_column
AS ([Name] COLLATE LATIN1_GENERAL_100_CI_AI));
CREATE INDEX [IX_table_name_SearchName]
ON dbo.[table_name] ([SearchName] ASC);
หรือคุณสามารถสร้างมุมมองแทนการเพิ่มคอลัมน์ที่คำนวณได้ (ตามที่jyaoต้องการ)