Błąd kolacji w UNION sygnalizuje niezgodność ustawień sortowania znaków pomiędzy zestawami wyników łączonymi tym operatorem.
Jak powstaje błąd kolacji w operatorze UNION
Błąd kolacji w zapytaniu UNION pojawia się wtedy, gdy silnik bazy danych próbuje połączyć wyniki dwóch lub większej liczby zapytań, ale nie może ustalić jednej reguły porównywania i sortowania wartości tekstowych. Kolacja określa między innymi sposób porządkowania znaków, ich porównywanie oraz często wrażliwość na wielkość liter i znaki diakrytyczne. Nie jest tym samym co kodowanie znaków. Kodowanie opisuje sposób zapisania znaków, natomiast kolacja definiuje reguły ich interpretowania przy porównywaniu.
Operator UNION łączy wyniki zapytań w jeden zbiór. Poszczególne zapytania muszą zwracać taką samą liczbę kolumn, a odpowiadające sobie kolumny powinny mieć zgodne albo możliwe do uzgodnienia typy danych. Jeżeli pierwsza gałąź zwraca tekst z jedną kolacją, a druga gałąź tekst z inną, silnik może zgłosić konflikt zamiast automatycznie wybrać regułę nadrzędną. Dokładny komunikat i zasady rozstrzygania zależą od używanego silnika oraz konfiguracji kolumn, tabel, bazy i połączenia.
Kolacje ukryte w kolumnach i wyrażeniach
Źródłem problemu nie musi być wyłącznie definicja tabeli. Różne kolacje mogą wystąpić w kolumnach pochodzących z odmiennych tabel, w literałach tekstowych, parametrach zapytania, wyrażeniach warunkowych, funkcjach przekształcających tekst oraz w wynikach podzapytań. Konflikt jest szczególnie prawdopodobny po połączeniu danych importowanych z kilku źródeł, po migracji bazy albo po dodaniu tabeli utworzonej z innymi ustawieniami domyślnymi.
Znaczenie ma również typ danych. Dwie wartości wyglądające jak zwykły tekst mogą mieć odmienne atrybuty dotyczące kodowania, długości, alfabetu lub porównywania. Kolacja przypisana do kolumny jest zwykle dziedziczona przez odczytywane wyrażenie, ale użycie funkcji, rzutowania typu lub jawnego określenia kolacji może zmienić reguły obowiązujące dla konkretnego fragmentu zapytania. Dlatego sam zgodny typ, na przykład dwa pola tekstowe, nie zawsze wystarcza do poprawnego wykonania UNION.
Ustalenie miejsca konfliktu w zapytaniu
Diagnozę warto rozpocząć od rozdzielenia zapytania na pojedyncze zapytania składowe. Każdą gałąź operatora UNION należy uruchomić osobno i sprawdzić, które kolumny tekstowe uczestniczą w łączeniu. Następnie trzeba porównać definicje odpowiadających sobie kolumn, w tym typ danych, długość, kodowanie oraz kolację. W zależności od silnika służą do tego polecenia opisujące schemat tabel, widoki systemowe albo narzędzia administracyjne. Nie należy zakładać, że ustawienie domyślne całej bazy jest identyczne z ustawieniem konkretnej kolumny.
Jeżeli zapytanie zawiera kilka operatorów UNION, konflikt może występować tylko w jednym połączeniu. Pomocne jest tymczasowe usuwanie kolejnych gałęzi lub zastępowanie kolumn tekstowych stałymi, aby zawęzić miejsce błędu. Trzeba także sprawdzić, czy problem nie wynika z widoku, funkcji albo podzapytania, którego definicja ukrywa właściwą kolację. Warto odróżnić błąd kolacji od błędu kodowania znaków: nieprawidłowe wyświetlanie polskich znaków może wskazywać na problem z kodowaniem, ale samo nie dowodzi konfliktu kolacji w UNION.
Ujednolicenie reguł porównywania tekstu
Naprawa polega na doprowadzeniu odpowiadających sobie wyrażeń tekstowych do wspólnej, świadomie wybranej kolacji. W wielu silnikach można zastosować jawne określenie kolacji w wyrażeniu, użyć rzutowania do odpowiedniego typu albo zmienić definicję kolumny, jeżeli różnica jest błędem schematu. Konkretna składnia nie jest uniwersalna, dlatego należy korzystać z dokumentacji właściwego silnika, a nie kopiować składnię z innego systemu bazodanowego. Wybór kolacji powinien uwzględniać alfabet danych, wymagane sortowanie, porównywanie wielkości liter i znaków diakrytycznych.
Po usunięciu konfliktu trzeba sprawdzić nie tylko wykonanie zapytania, lecz także jego wynik. Zmiana kolacji może wpłynąć na kolejność sortowania, wykrywanie duplikatów oraz działanie operatorów porównania. Ma to znaczenie, ponieważ UNION usuwa powtarzające się wiersze, a ocena, czy wartości tekstowe są równe, może zależeć od użytych reguł porównywania. Jeżeli potrzebne jest zachowanie wszystkich wierszy, stosuje się UNION ALL, ale nie rozwiązuje to niezgodności kolacji w samych wyrażeniach. Warszawskie Pogotowie Komputerowe zajmuje się profesjonalną naprawą laptopów, komputerów PC i ich podzespołów, w tym diagnozowaniem problemów z oprogramowaniem uruchamianym na tych urządzeniach.