COLLATE Clause
is a clause that can be applied when defining a varchar/char column in a CREATE TABLE statement.
This clause can also be applied to a varchar/char operand or result.
Syntax
COLLATE <collation>
Argument
- <collation>
- is a valid collation name. E.g.
latin1_general_ci_as,en_ci_as,fr_ci_as.
Remarks
You cannot apply a COLLATE clause to a variable.
DECLARE @a VARCHAR(30) COLLATE en_cs_as -- invalid syntax
raises a syntax error.
Examples
-- default server collation is en_ci_ai
PRINT 'hello' = 'HELLO';
-- collation used for comparison is english, case-sensitive, accent-sensitive
PRINT 'hello' = 'HELLO' COLLATE en_cs_as;
-- collation used for comparison is english, case-sensitive, accent-sensitive
PRINT 'hello' COLLATE en_cs_as = 'HELLO';
The result is:
true
false
false
Comparison operators like = depend on the collations of the operands, and use the “strongest” collation to perform the actual comparison.
The collation precedence is, from “strongest” to “weakest”:
- collation specified by
COLLATEclause applied to an operand. - collation specified by
COLLATEclause in the column definition ofCREATE TABLE. - default server collation.
Example of Collation Conflict
To avoid collation conflicts, you should use the COLLATE clause sparingly.
PRINT 'hello' COLLATE en_cs_as = 'HELLO' COLLATE en_ci_ai;
The result is:
<Syntax error. Cannot resolve conflict between en_ci_ai and en_cs_as collations.>
Example of collation inheritance
In the first example below, the first operand of CHARINDEX has the server default collation en_ci_ai.
In the second example below, this operand has en_cs_as collation, inherited from the COLLATE clause, higher in the parse tree.
PRINT CHARINDEX('a' + CAST(123 as VARCHAR(100)) + 'b', 'hello A123B apple a123b banana');
PRINT CHARINDEX('a' + CAST(123 as VARCHAR(100)) COLLATE en_cs_as + 'b', 'hello A123B apple a123b banana');
The result is:
7
19