Právě jsem zažil takový malý šok, ale to je moje vina, že odklikávám věci které neznám aniž bych si o nich něco zjistil. Programuji stále několik stránek pro statistiku, archivaci, sdílení, atd. gpx souborů z navigací Garmin, ale určitě i jiných(je to co nejvíce univerzální). Každá stopa se zobrazí veřejně, pokud uživatel bude znát její 5ti místný kód a ID uživatele.
5 míst je docela málo pro ochranu, ale zase to není pro hesla. A zkouším v jiném prohlížeči, kde jsem byl přihlášen na svůj admin účet pozměnit tento kód, zda se vypíše nějaká chyba. Ani ve snu by mě nenapadlo že ve výchozím stavu bude mít SQL Server pro Česko collation Czech_CI_AS, což znamená case insensitive, accent sensitive – vždyť i kdyby si to uchovávalo 2x textové sloupce, tak vyhledávat ve 2 musí být strašná námaha(a to už ani nemluvím o obsazeném místě), natož když by při prohledávání každé tabulky musel všude u textu převádět na stejné case.
To co to znamená jsem si zjistil z SQL Server Management Studio:

Zkusil jsem tedy změnit collation pro databázi. Ukazovalo mi to že DB je skutečně Czech_CS_AS ale chovalo se to stejně, jen teď si nejsem jistý zda jsem zkoušel vytvořit znovu databázi ale asi jo. Googlil jsem dál a našel jsem jak nastavit collation pro sloupce explicitně. Tak jsem to zkusil, napsal jsem si tento kód ke kódu který vytváří SQL command pro vytvoření tabulky:
/*Tyto typy ktere pouzivam nemuzou obsahovat text a collace je u nich zakazana
* t == System.Data.SqlDbType.BigInt ||
* t == System.Data.SqlDbType.Int ||
* t == System.Data.SqlDbType.Bit ||
* t == System.Data.SqlDbType.TinyInt ||
* t == System.Data.SqlDbType.SmallInt ||
* t == System.Data.SqlDbType.UniqueIdentifier ||
* t == System.Data.SqlDbType.Date ||
* t == System.Data.SqlDbType.SmallDateTime ||
* t == System.Data.SqlDbType.Real ||
* t == System.Data.SqlDbType.Binary ||
* t == System.Data.SqlDbType.Decimal ||
*/
if (
t == System.Data.SqlDbType.VarChar ||
t == System.Data.SqlDbType.Char ||
t == System.Data.SqlDbType.NVarChar ||
t == System.Data.SqlDbType.NChar
)
{
sb.AddItem("COLLATE Czech_CS_AS_KS_WS");
}Jsou tam všechny typy které ve svých aplikacích používám a i u těch kde bych to čekal že collation nebudu moct použít jsem je vyzkoušel – nešly. Collation jde nastavit pouze u textových sloupců a navíc pouze za definici sloupce – tedy například hned za VarChar NazevSloupce(10), jinak to vyhodí výjimku. Nastavuji tam collation Czech_CS_AS_KS_WS abych měl jistotu že už skutečně nic nebude “necitlivé”. Zkusil jsem vytvořit znovu tabulku s daty a už to šlo.
Tak jsem změnil collation pro databázi zpět na Czech_CI_AS, resetoval PC a znovu vytvořit tabulku – i tu to šlo. Takže teď už budu vědět že u textových sloupců musím použít Collate deklaraci.