Czy właściwość COLLATE dla pól tekstowych w tabeli ma wpływ na wprowadzane i przechowywane wartości tekstowe?
Czy właściwość COLLATE dla pól tekstowych w tabeli ma wpływ na wprowadzane i przechowywane wartości tekstowe?
Odpowiedź na to pytanie jest dość skomplikowana i zależy od kilku parametrów, dlatego zilustruję ją prostym przykładem.
Utwórzmy poligon w postaci tabelki:
CREATE TABLE Atkom_Collation (AcID int IDENTITY(1,1) , Nazwisko_un nvarchar(50) , Nazwisko_lt varchar(50) COLLATE Latin1_General_CI_AI , Nazwisko_pl varchar(50) COLLATE Polish_CI_AS , Nazwisko_jp varchar(50) COLLATE Japanese_CI_AS_KS );
Tabela posiada 4 pola tekstowe, jedno UNICODE i 3 z kodowaniem nie UNICODE, dla tych 3 kolumn ustawiłem różne wartości właściwości COLLATE.
Teraz wypełnijmy ją danymi zawierającymi różne zestawy znaków.
DECLARE @Nazwisko_un nvarchar(50); DECLARE @Nazwisko varchar(50); SET @Nazwisko_un=N'Środa-u'; SET @Nazwisko='Środa-n'; INSERT INTO Atkom_Collation (Nazwisko_un,Nazwisko_lt, Nazwisko_pl, Nazwisko_jp) VALUES (@Nazwisko_un,@Nazwisko_un,@Nazwisko_un,@Nazwisko_un), (@Nazwisko,@Nazwisko,@Nazwisko,@Nazwisko); SET @Nazwisko_un=N'Miércolesũ-u'; SET @Nazwisko='Miércolesũ-n'; INSERT INTO Atkom_Collation (Nazwisko_un,Nazwisko_lt, Nazwisko_pl, Nazwisko_jp) VALUES (@Nazwisko_un,@Nazwisko_un,@Nazwisko_un,@Nazwisko_un), (@Nazwisko,@Nazwisko,@Nazwisko,@Nazwisko); SET @Nazwisko_un=N'水曜日-u'; SET @Nazwisko='水曜日-n'; INSERT INTO Atkom_Collation (Nazwisko_un,Nazwisko_lt, Nazwisko_pl, Nazwisko_jp) VALUES (@Nazwisko_un,@Nazwisko_un,@Nazwisko_un,@Nazwisko_un), (@Nazwisko,@Nazwisko,@Nazwisko,@Nazwisko);
Do wypełnienia tabeli wykorzystaliśmy 2 zmienne: jedną z typem danych UNICODE i drugą nie UNICODE. Dla ułatwienia analizy wyników do każdego zestawu danych dodałem sufiks '-u', gdy wykorzystywałem zmienną UNICODE i '-n' gdy wykorzystywałem zmienną nie UNICODE.
Do tabeli dodałem 6 rekordów, w 3 parach, korzystając z różnego zestawu znaków.
Zobaczmy, jaki był rezultat tego eksperymentu.
SELECT * FROM Atkom_Collation
W wyniku otrzymałem:
Przeanalizujmy otrzymane dane.
Dla danych UNICODE wartość właściwości COLLATE nie ma żadnego znaczenia dla wartości wprowadzanych znaków. Natomiast w przypadku danych typu nie UNICODE w zależności od wartości właściwości COLLATE różne znaki są prezentowane w różny sposób, czyli jeżeli taki znak występuje we wskazanym zestawie znaków jest on przechowywany tak, jak został wprowadzony. Jeżeli takiego znaku nie ma, ale można go rzutować na znak występujący w danym zestawie, znak zostanie zastąpiony, jeżeli natomiast taki znak nie występuje w danym zestawie oraz nie można go rzutować na inny znak, zostanie on zastąpiony przez znak '?'.
W powyższym przykładzie należy pamiętać, że dane dodawaliśmy za pomocą zmiennej, co oznacza, że one też miały swoją wartość właściwości COLLATE odziedziczone po instancji serwera.