2015-04-02 7 views
5

Mam trudności ze zrozumieniem, dlaczego warunek SELECT z warunkiem LIKE na emulatorze 4 B szerokości (http://emojipedia.org/eyes/) zwraca wszystkie wiersze w tabeli.SQL Server 2014 LIKE z 4 znakami o szerokości B zwraca całą tabelę

Wynik z pierwszego wyboru to pojedynczy wiersz emoji. Jednak wynik z drugiego wyboru, gdzie ciąg jest oznaczony jako UNICODE z prefiksem N, to wszystkie wiersze.

Dlaczego drugi wybór pasuje do wszystkich wierszy w tabeli?

Rzeczywista Scenariusz Mam aplikacji internetowej, na której użytkownicy mogą wyszukiwania katalogu, a jeśli oni wyszukiwać za emotikonom cała tabela jest zwracany, zamiast odpowiednio dobranych rzędach.

ASP.NET MVC 5 web application <-> Web Api 2 <-> EF -> SQL Server 

Aktualizacja Moje testy SQL jest błędne, gdyż @deroby wskazał oświadczenia INSERT powinny być oznakowane N „...” być prawidłowo włożona jako Unicode.

Rozwiązanie Jak powiedział @deroby, wydaje się, że jest to problem z kolacją, zmiana na Finnish_Swedish_100_CI_AS sprawia, że ​​wszystko działa zgodnie z oczekiwaniami.

select * from #Test where Value like N'%%' COLLATE Finnish_Swedish_100_CI_AS 

Odpowiedz

3

Robi się jeszcze więcej zabawy podczas dodawania

INSERT INTO #Test VALUES (''); -- should be http://emojipedia.org/eyes/ 

Twoja pierwsza SELECT spowoduje powrót oba rekordy emoji; nawet jeśli będą wyglądać źle. Powodem jest to, że zarówno i są nieprawidłowe wartości varchar(). W efekcie umieszcza się w bazie danych jakiś element zastępczy (pokazany jako ??).

Teraz, jeśli zrobić „właściwie” i wstawić dane swoich wkładek jako odpowiednich ciągów Unicode, a następnie rzeczy wypracować dużo lepszy:

INSERT INTO #Test VALUES (N''); 
INSERT INTO #Test VALUES (N'a'); 
INSERT INTO #Test VALUES (N'b'); 
INSERT INTO #Test VALUES (N'c'); 
INSERT INTO #Test VALUES (N''); -- should be http://emojipedia.org/eyes/ 
INSERT INTO #Test VALUES (N''); -- should be http://emojipedia.org/eyes/ 

select * from #Test -- returns everything 
select * from #Test where Value like '%%' -- returns nothing (because it looks for the '??' placeholder 
select * from #Test where Value like N'%%' -- returns just one line 

PS: to jak to działa na moim SQL2012 tutaj (Latin1_General_BIN).

Dlaczego drugi wybór pasuje do wszystkich wierszy w tabeli?

Że nie mogę wyjaśnić; dla mnie tak nie jest. Zgaduję więc, że jest to kwestia sortowania, w której wszystkie te emoji są uważane za równe.

I rzeczywiście, robi test

select * from #Test where Value like N'%%' COLLATE Finnish_Swedish_CI_AS 
select * from #Test where Value like N'%%' COLLATE Latin1_General_BIN 

pokazuje, że powód musi być postrzegana tutaj. Co do tego, dlaczego nie mam pojęcia.

Powiązane problemy