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.
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. |
Kalendarz
KategorieInne blogiArchiwaWrzesień 2008 (0)
Sierpień 2008 (6) Lipiec 2008 (3) Czerwiec 2008 (1) Maj 2008 (0) Kwiecień 2008 (1) Marzec 2008 (4) Luty 2008 (6) Styczeń 2008 (3) Grudzień 2007 (5) Listopad 2007 (7) Październik 2007 (4) Wrzesień 2007 (6) Sierpień 2007 (3) Lipiec 2007 (7) Czerwiec 2007 (6) Maj 2007 (4) Kwiecień 2007 (5) Marzec 2007 (6) Luty 2007 (10) Styczeń 2007 (8) Grudzień 2006 (4) Listopad 2006 (6) Październik 2006 (13) Ostatnie.... Starsze... Ostatnie wpisySQL Server 2008 - czas na hotfixy
czwartek, sierpień 28 2008 Meandry wersji RTM - jak to jest z tym Ctrl+N? poniedziałek, sierpień 18 2008 Ciekawostki MSSQL: estimated execution plan środa, sierpień 13 2008 SQL Server 2008 - capacity and features wtorek, sierpień 12 2008 Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 - pierwsze wrażenie piątek, sierpień 8 2008 Jest SQL Server 2008 RTM czwartek, sierpień 7 2008 Security Update for SQL Server 7.0 - 2005 środa, lipiec 9 2008 Virtual Earth -> Geospatial Data Generator środa, lipiec 9 2008 SQL Server 2008 RTM w przyszłym tygodniu? czwartek, lipiec 3 2008 Oficjalne logo SQL Server 2008 środa, czerwiec 4 2008 SQL Server 2005 SP3 w czwartym kwartale środa, kwiecień 16 2008 V Spotkanie PLSSUG Lublin - Heroes {Community} Launch wtorek, marzec 25 2008 SQL Server 2008: fizyczny lokalizator wiersza czwartek, marzec 20 2008 Szybko, tanio, dobrze piątek, marzec 14 2008 WyszukajLicencja |
|||||||||||||||||||||||||||||||||||||||||||||||||