Ciekawostki MSSQL: spacje na końcu stringówŚlady
Użyj tego linku jeśli chcesz stworzyć Ślad (Trackback) do tego wpisu
Brak Śladów
Komentarze
Wyświetl komentarze jako
(Płasko | Wątki)
Dopisz koniecznie, że nvarchar ma zawsze ustawioną opcję ANSI_PADDING na ON i nie ucina spacji. W ogóle to nie jest do końca kwestia ucinania spacji. Chodzi raczej o to, że ANSI narzuca, że stringi muszą być równej długości, by można je było porównać. Dlatego jak jeden string jest krótszy, to serwer uzupełnia go spacjami (na to wygląda) na czas zapytania. Warto też wspomnieć, co dzieje się, jak użyjesz char / nchar (wypełnienie spacjami do maks. długości) :-)
No i podać workaround (LIKE).
Co do tego nvarchara - celna uwaga - ludzie generalnie czytają komentarze do postów, więc na pewno to zauważą :) (umieściłem zbiorczą uwagę w poście)
Nie mówiłem, że podczas porównywania jest cokolwiek ucinane - natomiast jest ucinane w przypadku operacji INSERT przy ANSI_PADDING na OFF, o ile nie chodzi o kolumny typu n*. A żeby jeszcze bardziej zamieszać - w KB231830 jest mowa o opcji ANSI_PADDING odnoszącej się do kolumny varchar. Przy ANSI_PADDING na OFF ucinanie działa też na kolumnie typu char (jednak przy nchar - już oczywiście nie). Generalnie to wrażenie niespójności może tutaj być uzasadnione :) A ten workaround z LIKE dla mnie to lipa :) Pozdrawiam, M.G.
Witaj.
Żeby jeszcze trochę bardziej zamieszać jest jeden wyjątek, którego istnienie jest sprzeczne z następującym stwierdzenie:"Natomiast przy ANSI_PADDING ustawionym na OFF, char zachowuje się analogicznie jak varchar (spacje są również ucinane)." (z wpisu na blogu). W przypadku, gdy kolumna jest typu CHAR/BINARY istotne znaczenie ma również właściwość kolumny AllowNulls. W przypadku, gdy NULL-e są dopuszczalne wstawianie danych powoduje, że "trailing blanks" są "usuwane". Natomiast, gdy kolumna jest NOT NULL spacje "nie są usuwane". Warto również zaznaczyć, iż fizycznie spacje takie są przechowywane na stronach danych (kolumna o stałej długości), lecz w momencie ich przetwarzania (np. przesłanie do klienta) silnik bazy danych decyduje, czy "obciąć spacje" (kolumna z dopuszczalnymi NULL-ami) czy nie (kolumna NOT NULL). Moim zdaniem pisząc o opcji SET ANSI_PADDING warto również zwrócić szczególną uwagę na fakt, iż tak naprawdę to jak będą traktowane spacje podczas wstawiania (i ew. pobierania o czym przed chwilą napisałem) zależy od właściwości "UseAnsiTrim" kolumny a nie bezpośrednio od stanu opcji sesji. Opcja SET ANSI_PADDING odgrywa istotną rolę przy tworzeniu tabeli i w tym momencie determinuje sposób traktowania spacji (ustawiana jest właściwość UseAnsiTrim). Piszę o tym dlatego, gdyż uważam iż jest to istotny szczegół, którego nie wyłowiłem z Twojego wpisu na blogu (szczególnie, że wspominasz o operacji INSERT). Jestem również świadomy, że ten wpis nie był bezpośrednio o opcji ANSI_PADDING, więc za moją ewentualną nadgorliwość przepraszam:) Pozdrawiam.
#1.1.1
o
2007-08-22 21:02
Faktycznie wpis nie był zasadniczo o ANSI_PADDING i miał krótko i zwięźle zwrócić uwagę na troszeczkę inną funkcjonalność, co zupełnie nie stoi na przeszkodzie, żeby jego niedopowiedzenia uzupełniać/poprawiać w komentarzach :) - za co dziękuję.
Co do meritum: rzeczywiście masz rację, zaraz we wpisie wstawię jakieś odesłanie lub uzupełnienie. Pozdrawiam, M.G. Autor nie zezwolił na komentowanie tego wpisu
|
Kalendarz
KategorieInne blogiOstatnie wpisyPo 17. spotkaniu PLSSUG Lublin
czwartek, wrzesień 17 2009 Mac OS X Snow Leopard - pierwsze wrażenia niedziela, wrzesień 13 2009 PLSSUG Lublin: wakacyjna przerwa w spotkaniach niedziela, czerwiec 7 2009 15. spotkanie PLSSUG Lublin piątek, kwiecień 17 2009 SQL Server Standard 64bit - czy dziś znów się wyłoży? sobota, marzec 28 2009 14. spotkanie PLSSUG Lublin i kilka słów o grupie czwartek, marzec 5 2009 SQL Server 2008 Service Pack 1 CTP środa, luty 25 2009 SQL Server 2008 System Views Map niedziela, luty 15 2009 13. spotkanie PLSSUG Lublin czwartek, luty 12 2009 Windows 7 - co powie ryba niedziela, luty 8 2009 WyszukajLicencja |
|||||||||||||||||||||||||||||||||||||||||||||||||