Sdílet prostřednictvím


Priorita kolace

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLAzure Synapse AnalyticsAnalytics Platform System (PDW)Koncový bod analýzy SQL v Microsoft FabricSklad v Microsoft FabricDatabáze SQL v Microsoft Fabric

Priorita kolace, označovaná také jako pravidla převodu kolace, určuje následující dva výsledky:

  • Kolace konečného výsledku výrazu, který je vyhodnocen jako řetězec znaků.

  • Kolace, kterou používají operátory citlivé na kolaci, které používají vstupy řetězců znaků, ale nevracejí řetězec znaků, například LIKE in.

Pravidla priority kolace se vztahují pouze na datové typy řetězců znaků: char, varchar, text, nchar, nvarchar a ntext. Objekty, které mají jiné datové typy, se neúčastní vyhodnocení kolace.

Popisky kolace

Následující tabulka uvádí a popisuje čtyři kategorie, ve kterých jsou identifikovány kolace všech objektů. Název každé kategorie je popisek kolace.

Popisek kolace Typy objektů
Coercible-default Všechny Transact-SQL proměnné řetězce znaků, parametru, literálu nebo výstupu předdefinované funkce katalogu nebo předdefinované funkce, která nepřebírají řetězcové vstupy, ale vytváří výstup řetězce.

Pokud je objekt deklarován v uživatelem definované funkci, uložené procedurě nebo triggeru, je objekt přiřazen výchozí kolace databáze, ve které je funkce, uložená procedura nebo aktivační událost vytvořena. Pokud je objekt deklarován v dávce, je objekt přiřazen výchozí kolace aktuální databáze pro připojení.
Implicit X Odkaz na sloupec. Kolace výrazu (X) se přebírá z kolace definovaného pro sloupec v tabulce nebo zobrazení.

I když byl sloupec explicitně přiřazen kolaci pomocí COLLATE klauzule v CREATE TABLE příkazu nebo CREATE VIEW klauzule, je odkaz na sloupec klasifikován jako implicitní.
Explicit X Výraz, který je explicitně přetypován na konkrétní kolaci (X) pomocí COLLATE klauzule ve výrazu.
No-collation Označuje, že hodnota výrazu je výsledkem operace mezi dvěma řetězci, které mají konfliktní kolace implicitního popisku kolace. Výsledek výrazu je definován tak, že nemá kolaci.

Pravidla kolace

Popisek kolace jednoduchého výrazu, který odkazuje pouze na jeden objekt řetězce znaků, je popisek kolace odkazovaného objektu.

Popisek kolace komplexního výrazu, který odkazuje na dva operandové výrazy se stejným popiskem kolace, je popisek kolace výrazů operandu.

Popisek kolace konečného výsledku komplexního výrazu, který odkazuje na dva operandové výrazy s různými kolacemi, vychází z následujících pravidel:

  • Explicitní má přednost před implicitním. Implicitní má přednost před výchozí hodnotou Coercible:

    Explicitní > implicitní implicitní > výchozí nastavení

  • Kombinace dvou explicitních výrazů, které byly přiřazeny různým kolací, generuje chybu:

    Explicitní X + explicitní Y = chyba

  • Kombinace dvou implicitních výrazů, které mají různé kolace, přináší výsledek bez kolace:

    Implicitní X + implicitní Y = bez kolace

  • Kombinace výrazu s výrazem Bez kolace s výrazem libovolného popisku s výjimkou explicitního kolace (viz následující pravidlo) způsobí výsledek, který má popisek bez kolace:

    Žádná kolace + cokoli = Žádná kolace

  • Kombinace výrazu s výrazem Bez kolace s výrazem, který má explicitní kolaci, poskytuje výraz s explicitním popiskem:

    Žádná kolace + explicitní X = explicitní

Následující tabulka shrnuje pravidla.

Popisek převodu operandu Explicitní X Implicitní X Výchozí nastavení Bez kolace
Explicit Y Vygeneruje chybu. Výsledek je explicitní Y Výsledek je explicitní Y Výsledek je explicitní Y
Implicit Y Výsledek je explicitní X Výsledek je bez kolace Výsledek je implicitní Y Výsledek je bez kolace
Coercible-default Výsledek je explicitní X Výsledek je implicitní X Výsledek je výchozí hodnota coercible Výsledek je bez kolace
No-collation Výsledek je explicitní X Výsledek je bez kolace Výsledek je bez kolace Výsledek je bez kolace

Následující další pravidla platí také pro prioritu kolace:

  • U výrazu, který už je explicitním výrazem, nemůžete mít více COLLATE klauzulí. Například následující WHERE klauzule není platná, protože COLLATE klauzule je zadaná pro výraz, který je již explicitním výrazem:

    WHERE ColumnA = ( 'abc' COLLATE French_CI_AS) COLLATE French_CS_AS

  • Převody znakových stránek pro textové datové typy nejsou povolené. Pokud mají různé znakové stránky, nemůžete přetypovat textový výraz z jedné kolace na jiný. Operátor přiřazení nemůže přiřadit hodnoty, pokud kolace pravého textového operandu má jinou znakovou stránku než levý textový operand.

Priorita kolace je určena po převodu datového typu. Operand, ze kterého je výsledná kolace převzata, se může lišit od operandu, který poskytuje datový typ konečného výsledku. Představte si například následující dávku:

CREATE TABLE TestTab
(
    PrimaryKey INT PRIMARY KEY,
    CharCol CHAR (10) COLLATE French_CI_AS
);

SELECT *
FROM TestTab
WHERE CharCol LIKE N'abc';

Poznámka:

Datový typ nvarchar není ve službě Fabric Warehouse podporovaný, ale většina příkladů v tomto článku se vztahuje jak na varchar pomocí UTF-8, tak nvarchar, a proto zůstávají použitelné pro Fabric Warehouse, pokud není uvedeno jinak.

Datový typ Unicode jednoduchého výrazu N'abc' má vyšší prioritu datového typu. Výsledný výraz má proto přiřazen N'abc'datový typ Unicode . Výraz CharCol má ale kolační popisek Implicitu a N'abc' má nižší popisek převodu coercible-default. Proto kolace, která se používá, je French_CI_AS kolace CharCol.

Příklady pravidel kolace

Následující příklady ukazují, jak fungují pravidla kolace. Pokud chcete spustit příklady, vytvořte následující testovací tabulku.

USE tempdb;
GO

CREATE TABLE TestTab
(
    id INT,
    GreekCol NVARCHAR (10) COLLATE greek_ci_as,
    LatinCol NVARCHAR (10) COLLATE latin1_general_cs_as
);

INSERT TestTab
VALUES (1, N'A', N'a');
GO

Konflikt kolace a chyba

Predikát v následujícím dotazu má konflikt kolace a vygeneruje chybu.

SELECT *
FROM TestTab
WHERE GreekCol = LatinCol;

Tady je soubor výsledků.

Msg 448, Level 16, State 9, Line 2
Cannot resolve collation conflict between 'Latin1_General_CS_AS' and 'Greek_CI_AS' in equal to operation.

Explicitní popisek versus implicitní popisek

Predikát v následujícím dotazu se vyhodnocuje v kolaci greek_ci_as , protože správný výraz má explicitní popisek. Má přednost před implicitní popisek levého výrazu.

SELECT *
FROM TestTab
WHERE GreekCol = LatinCol COLLATE greek_ci_as;

Tady je soubor výsledků.

id          GreekCol             LatinCol
----------- -------------------- --------------------
          1 A                    a

Popisky bez kolace

Poznámka:

Vzhledem k rozdílu mezi chováním nvarcharu a varcharu v kolaci UTF-8 se tento příklad nevztahuje ve službě Fabric Warehouse.

Výrazy CASE v následujícíchdotazch Výrazy ale můžou být provozovány operátory bez rozlišení kolace.

SELECT (CASE WHEN id > 10 THEN GreekCol ELSE LatinCol END)
FROM TestTab;

Tady je soubor výsledků.

Msg 451, Level 16, State 1, Line 1
Cannot resolve collation conflict for column 1 in SELECT statement.
SELECT PATINDEX((CASE WHEN id > 10 THEN GreekCol ELSE LatinCol END), 'a')
FROM TestTab;

Tady je soubor výsledků.

Msg 446, Level 16, State 9, Server LEIH2, Line 1
Cannot resolve collation conflict for patindex operation.
SELECT (CASE WHEN id > 10 THEN GreekCol ELSE LatinCol END) COLLATE Latin1_General_CI_AS
FROM TestTab;

Tady je soubor výsledků.

--------------------
a

Citlivá kolace a kolace nerozlišují

Operátory a funkce jsou citlivé na kolaci nebo nerozlišují.

  • Citlivá kolace: To znamená, že zadání operandu bez kolace je chyba v době kompilace. Výsledek výrazu nemůže být bez kolace.
  • Kompletace nerozlišuje: To znamená, že operandy a výsledek mohou být bez kolace.

Operátory a kolace

Relační operátory a MAXoperátory , MINBETWEENLIKEa IN operátory jsou citlivé na kolaci. Řetězec používaný operátory je přiřazen popisek kolace operandu, který má vyšší prioritu. Příkaz UNION je také citlivý na kolaci a všechny řetězcové operandy a konečný výsledek je přiřazen kolaci operandu s nejvyšší prioritou. Priorita kolace operandu a výsledku UNION se vyhodnotí podle sloupce.

Operátor přiřazení nerozlišuje kolaci a pravý výraz se přetypuje na levou kolaci.

Operátor zřetězení řetězců je citlivý na kolaci, dva řetězcové operandy a výsledek je přiřazen popisek kolace operandu s nejvyšší prioritou kolace. UNION ALL Příkazy CASE nerozlišují kolaci a všechny řetězcové operandy a konečné výsledky mají přiřazený popisek kolace operandu s nejvyšší prioritou. Priorita kolace operandů a výsledku UNION ALL se vyhodnotí podle sloupce.

Funkce a kolace

Funkce CASTa znak , CONVERTa COLLATE funkce jsou citlivé na znak, varchar a textové datové typy. Pokud jsou vstupy a výstupy CASTCONVERT funkcí řetězce znaků, má výstupní řetězec popisek kolace vstupního řetězce. Pokud vstup není znakový řetězec, je výstupní řetězec ve výchozím nastavení a přiřazen kolaci aktuální databáze pro připojení nebo databázi, která obsahuje uživatelem definovanou funkci, uloženou proceduru nebo trigger, ve kterém se odkazuje nebo CAST na kterou CONVERT odkazuje.

U předdefinovaných funkcí, které vracejí řetězec, ale nepřebírají řetězcový vstup, je výsledný řetězec výchozí hodnotou. Výsledný řetězec je přiřazen buď kolace aktuální databáze, nebo kolace databáze, která obsahuje uživatelem definovanou funkci, uloženou proceduru nebo trigger, ve kterém je funkce odkazována.

Následující funkce jsou citlivé na kolaci a jejich výstupní řetězce mají popisek kolace vstupního řetězce:

  • CHARINDEX
  • DIFFERENCE
  • ISNUMERIC
  • LEFT
  • LEN
  • LOWER
  • PATINDEX
  • REPLACE
  • REVERSE
  • RIGHT
  • SOUNDEX
  • STUFF
  • SUBSTRING
  • UPPER