Нуждаете се от съпоставяне без разлика на главни и малки букви, където ss != ß

За конкретна колона в база данни, работеща на SQL Server Express 2012, имам нужда от сортиране, където ss и ß не се считат за еднакви при сравняване на низове. Също така ä и ae, ö и oe и ü и ue трябва да се считат съответно за различни. Latin1_General_CI_AS предоставя последното, но ss и ß не се различават. Тоест, WHERE ThatColumn = 'Fass' би дало както Fass, така и Faß.

Просто бих се придържал към BIN/BIN2, но имам нужда от нечувствителност към главни и малки букви. Ако нищо друго не работи, ще трябва да използвам Latin1_General_BIN/Latin1_General_BIN2 и сам да се уверя, че всичко е с главни или малки букви. Това би означавало повече работа, тъй като трябва да мога да извлека версията и с подходяща буква.

Но ако има съпоставяне, което прави това, от което се нуждая, моля, уведомете ме. Благодаря предварително!

Актуализация: Повече информация за изискванията: базата данни съдържа лични имена от наследена система, която поддържа само ASCII знаци. Тоест имена като Müller и Faß се съхраняват като Mueller и Fass. В новата система потребителят ще има функция да преименува тези лица, напр. преименувайте "Mueller" на "Müller". За да намеря обектите, които се нуждаят от преименуване, трябва да търся редове, съдържащи напр. "Фас". Но както е сега, заявката също връща "Faß", което не е това, което искам. Все още имам нужда/искам нечувствителност към малки и главни букви, тъй като потребителят трябва да може да търси „fass“ и пак да получава „Fass“.

Има още нещо в системата, но мога категорично да кажа, че трябва да правя разлика между ss и ß, ä и ae и т.н.


person Andre Loker    schedule 27.04.2012    source източник
comment
Това изглежда странно изискване. Каквато и да е причина? Можете ли да го разширите - само ss и ß ли са или има други лигатури/специални, които трябва да бъдат специално третирани?   -  person Ben    schedule 27.04.2012
comment
Актуализирах въпроса. Определено трябва да мога да правя разлика между ss и ß.   -  person Andre Loker    schedule 27.04.2012


Отговори (1)


Съпоставянето SQL_Latin1_General_CP1_CI_AS счита 'ss' за различно от 'ß', така че може да работи за вас. Това е наследено съпоставяне, така че може да създаде несъвместимост с операционни системи и платформи за приложения. Може да има и други странности, за които не знам.

Преди няколко години скицирах едно странно решение за подобен проблем и можете да го разгледате тук. (Щракнете върху раздела „Заобиколни решения (1)“.) Проблемът в този случай беше относно уникалността в ключова колона, а не резултатите от сравнението на низове, така че да го приложите във вашата ситуация (и да сравните две колони, за да направите едно сравнение на низове) може да е неосъществимо.

person Steve Kass    schedule 27.04.2012
comment
Не, съжалявам, SQL_Latin1_General_CP1_CI_AS не работи. Ето как го тествах: pastebin.com/nEKJk7bX - person Andre Loker; 27.04.2012
comment
Андре, не вярвам, че тестът ти е адекватен. Подозирам, че сортирането на базата данни се прилага автоматично към постоянния низ във вашия пример за pastebin и сравнението не се прави под сортирането на колони. Вижте този пример: sqlfiddle.com/#!3/d5344/6 - person Steve Kass; 28.04.2012
comment
Аха! Сега виждам, че използвате nvarchar. Мисля, че SQL сортирането, което указва кодова страница, няма да работи за вас. Ако трябва да използвате nvarchar, мисля, че може да нямате късмет. - person Steve Kass; 28.04.2012
comment
Прав си, с varchar работи. Ще трябва да проверя дали мога да се измъкна с varchar в този специален случай. Приложението няма да се използва в международен план. - person Andre Loker; 28.04.2012
comment
Ще приема този отговор. Докато необходимостта да се върнем към varchar не е толкова голяма, разбира се, но засега ще ни свърши работа. - person Andre Loker; 03.05.2012