Čím nás mohou překvapit collations? II.

Zveřejněno 31 October 06 11:21 AM | mafalt 

Minule jsme si ukázali, kde nás mohou collations zradit, když se spoléháme na nastavení Case Insensitive. Dneska se podíváme, kde nás mohou zradit collations Czech_CI_AI a Slovak_CI_AI.

Vytvořme si testovací databázi, na které si tuto zradu ukážeme:


CREATE DATABASE Collations2 COLLATE Czech_CI_AI

GO

USE Collations2

GO

CREATE TABLE Test

(

       ID int NOT NULL IDENTITY(1, 1) PRIMARY KEY,

       Data nvarchar(50) NOT NULL

)

GO

INSERT INTO Test VALUES (N'Miloš')

INSERTINTO Test VALUES (N'Šárka')

INSERT INTO Test VALUES (N'sirka')

INSERT INTO Test VALUES (N'šířka')

INSERT INTO Test VALUES (N'macek')

INSERT INTO Test VALUES (N'mačkat')

INSERT INTO Test VALUES (N'možné')

INSERT INTO Test VALUES (N'mrznoucí')

GO

Databázi jsme si rovnou naplnili i testovacími daty a nyní si necháme vypsat všechny záznamy, které obsahují písmeno ‘s’.

SELECT * FROM Test WHERE Data LIKE '%s%'

Tento dotaz vrátí pouze řádek obsahující text ‘sirka’. Proč, když máme nastaveno accent-insensitive? Leckoho možná napadne, že se jedná o bug, ale není tomu tak. Pro SQL Server jsou ‘c’ a ‘č’ dvě naprosto rozdílná písmena, kde háček nemá žádnou diakritickou váhu. Totéž se týká a i zbývajících písmen z naší ukázky.

Příšte opustíme české a slovenské collations a podíváme se na zradu, která nás čeká při používání tureckých collation.

Vedeno pod:

Upozornění na nové komentáře

Pokud chčeš dostávat upozornění emailem na změny u toho příspěvku,tak se zaregistruj zde.zde

Odebírat komentáře k tomuto příspěvku pomocí RSS

Komentář

# rob said on October 31, 2006 4:17 PM:

No dobře, není to bug. Je to feature.

1. K čemu je tedy dobrá?

2. Jak tedy implementujete tu feature, kterou jsme si měli myslet, že by to mělo řešit (tj. hledání bez ohledu na diakritiku)?

Na druhou otázku si odpovím sám - použijeme (poněkud překvapivě COLLATE QL_Latin1_General_CP1251_CI_AS).

Na tu druhou odpovědět ale neumím. Na co je to tedy dobré?

# mafalt said on October 31, 2006 7:34 PM:

2 rob: Smyslem tohoto příspěvku není upozornit na feature, ale na to, že se SQL Server chová právě takto. Možná Vám to přijde divné, ale konkrétně na toto chování jsem už obdržel několik dotazů. Ad 2. Jak toto řešit? Já osobně bych to řešil fulltextovým indexem.

# rob said on October 31, 2006 8:14 PM:

Jasně. To ale neznamená, že o tom nemůžeme diskutovat a navrhnout nějaké řešení nebo použití.

Co se týče fulltextového indexu na hledání bez diakritiky - sorry ale nepřijde mi to jako řešení - vlastností fulltextu přece není ořezání diakritiky, ale naopak skloňování. Možná při nastavení na neutral language a ukládání již ořezaných dat. Jenže zde zůstává stejná otázka - jaký COLLATE použít na ořezání dat na SQL serveru - odpověď je stejná ten CP1251.

K té feature při nastavení Czech_CI_AI - co vede někoho aby si takový Collation vůbec nastavil? Já nikoho takového neznám - což samozřejmě nic neznamená. Takže se ptám máš nějaké praktické reference na někoho kdo to používá a proč?

# mafalt said on October 31, 2006 8:57 PM:

2 rob: Ja vim, ze fulltext je v tomto pripade kanon na komara :-). Řešil jsem dva případy, kde tohle chtěli nasadit, ale zmíněné chování jim v tom zabránilo. Nakonec takovéto hledání vyřešili funkcí, která vyhledala všechny záznamy s diakritikou i bez diakritiky.

# iayahzi said on April 26, 2010 11:04 AM:

Vim, ze sice clanek je jiz hodne stary, ale snad nekdo zareaguje. Resim problem, na MS SQL 2005 datova zakladna. Jako frontend pro uzivatele slouzi MS Access, problem je v tom, ze u sloupecku s nekterymi diakritickymi znaky nefunguje filtrovani. Muze za to byt zoodpovedne Collation nastaveni serveru?

# rob said on April 26, 2010 12:40 PM:

Clanek popisuje (dle meho nazoru chybne) chovani, kdy collation Czech_CI_AI nezpusobi porovnavani bez diakritiky. Namisto toho je treba pouzi nejake nesmyslne typu Latin1_General_CI_AI apod.

Vas problem s MS Access bych videl spis ve spatnem nastaveni collations.

# indir said on June 9, 2010 8:37 PM:

Become a really useful article. Thanks for the information

Vytvoření nového komentáře

(povinný) 
(nepovinný)
(povinný) 
Opiš čísla, která vidíš na obrázku: