"Nerede" deki aksanları yoksay


17

Veritabanımızda caron / hatschek ile birden fazla girişimiz var. Şimdi kullanıcılarımız olmadan girişleri ararken caron / hatschek dahil girişleri bulmak istiyorlar. Bunu basit bir örnekle göstereceğim:

Veritabanımızda girişimiz var (isim ile iletişim)

Millière

bu yüzden kişinin yaşadığı ülkede bu isim doğrudur.

Ülkemizde caron / hatschek karakteri bulunmuyor, bu nedenle kullanıcılarımız arıyor Milliere. èAçıkçası eşleşmediği gibi hiçbir sonuç gelmiyor e.

Ben bu şekilde gerçekleştirilebilecek nasıl hiçbir fikrim yok é, è, êve daha birçok bulabilirsiniz (ve bu sadece harf için bir örnektir e...).

(Diğer yol çok daha kolay olurdu, çünkü basitçe tüm harfleri caron / hatschek ile temel olanla değiştirebilirim.


"È" harfinin bir caron / hacek olmadığını, mezar aksanına dikkat edin; bir caron / hacek "ě" olur. "Aksanlı karakterler" mi demek istediniz? Yoksa özellikle caron / hacek aksanı mı kastediyorsunuz?
psmears

"işaretler" ile herhangi bir karakter demek (üzgünüm bunun için gerçek adını bilmiyorum.
Lumo

Yanıtlar:


31

Bu sorun, aksama duyarlı olmayan harmanlamalar kullanılarak çözülebilir .

Veritabanınız muhtemelen bir AS (Accent Sensitive) harmanlaması kullanıyor, bu yüzden varsayılan olarak aksanlar da dahil olmak üzere tam eşleşmeyi arayacaktır.

Karşılaştırma ile bir harmanlama belirterek WHERE yan tümcesini veritabanı varsayılanından başka bir harmanlama kullanma talimatı verebilirsiniz.

Gelen bu dbfiddle ben LATIN1 alfabe kullanan bir örnek oluşturdu, ancak sadece kendi sütun şu anda kullandığı harmanlama için AI içine AS değiştirerek kullandığınız harmanlama ile aynı yaklaşımı kullanabilirsiniz.

Sütunun kullandığı harmanlama ile eşleşen Accent Duyarsız harmanlamayı kullanın. Sütun kullanarak Örneğin SQL_Latin1_General_CP1_CI_AS, kullanımını SQL_Latin1_General_CP1_CI_AIve Latin1_General_CI_ASya Latin1_General_100_CI_ASolan veya olmayan SQL_ alfabe davranışı beri o ikisinin varyasyonların herhangi sadece aksan-duyarsızlığı daha farklı şekillerde farklı olacaktır ve bu kullanıcılar tarafından beklendiği gibi olmayabilir.

İçinde geçerli harmanlamayı kontrol edebilirsiniz 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

Daha fazla bilgi için SQL Server Harmanlamalarını Kullanma bölümünü okuyun .

Sonra tekrar muhtemelen (bu harmanlamayı kullanmak için sıralama istediğiniz ediyorum peufeu "e" ile o "é" türlü sağlamak için açıklamalarda belirtildiği). Aksi takdirde, sonuçları alfabetik sırayla sayfalandıran biri, onların olmasını bekledikleri yerde "é" yi bulamamaya şaşırır, ancak yalnızca bu sorguya dokunmak istiyorsanız COLLATEmaddeyi de ekleyebilirsiniz ORDER BY.

Solomon Rutzky'nin yorumlarda belirttiği gibi , bu yalnızca 1 veya birkaç sütunu etkiliyorsa, başka bir seçenek de, "ad" sütununu tekrarlayan ve aksana duyarsız harmanlama sağlayan kalıcı olmayan bir hesaplanmış sütun oluşturmak ve hesaplanan dizini oluşturmaktır. sütunu. Bu, sorgu içindeki harmanlamayı değiştirerek oluşan taramayı önler. Ardından, sorgunun yeni sütunda filtrelenmesi gerekir.

Gibi bir şey:

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);

Veya hesaplanmış bir sütun ( jyao tercih ettiği gibi) eklemek yerine bir görünüm de oluşturabilirsiniz .


1
Tom: Sütunun kullandığı Harmanlamanın Accent-Insensitive versiyonunu kullanmaları gerektiğini (ve 3. paragrafta belirtilen veritabanının varsayılan harmanlaması bu soru ile ilgili olmadığını ) not ederdim (ve vurgularım ). Sütun kullanıyorsa SQL_Latin1_General_CP1_CI_AS, kullanımı SQL_Latin1_General_CP1_CI_AIve Latin1_General_CI_ASya Latin1_General_100_CI_ASya olmayan davranışları beri o ikisinin varyasyonların herhangi SQL_alfabe sadece aksan-duyarsızlığı daha farklı şekillerde farklı olacaktır ve bu kullanıcılar tarafından beklendiği gibi olmayabilir. Harmanlama konumunda sys.columns.
Solomon Rutzky

@SolomonRutzky iyi öneri
Tom V - Takım Monica
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.