Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro:SQL Server
Azure SQL Database
Spravovaná instance Azure SQL
Azure Synapse Analytics
Analytics Platform System (PDW)
Koncový bod analýzy SQL v Microsoft Fabric
Sklad v Microsoft Fabric
Databá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
LIKEin.
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
COLLATEklauzulí. Například následujícíWHEREklauzule není platná, protožeCOLLATEklauzule je zadaná pro výraz, který je již explicitním výrazem:WHERE ColumnA = ( 'abc' COLLATE French_CI_AS) COLLATE French_CS_ASPř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:
CHARINDEXDIFFERENCEISNUMERICLEFTLENLOWERPATINDEXREPLACEREVERSERIGHTSOUNDEXSTUFFSUBSTRINGUPPER
Související obsah
- COLLATE (Transact-SQL)
- Převod datového typu (databázový stroj)
- Operátory (Transact-SQL)
- Výrazy (Transact-SQL)