Сортировка относится к набору правил, которые определяют, как данные сортируются и сравниваются в SQL Server. Она определяет правильную последовательность символов и предоставляет опции для учета регистра, учета знаков, типов символов кана и ширины символов.
Учет регистра
Учет регистра определяет, будут ли прописные и строчные буквы обрабатываться одинаково или по-разному. Например, если “A” и “a” обрабатываются одинаково, то сортировка не учитывает регистр. Однако, если они обрабатываются по-разному, то сортировка учитывает регистр.
Учет знаков
Учет знаков определяет, будут ли символы с ударениями обрабатываться одинаково или по-разному. Если “a” и “á” обрабатываются одинаково, то сортировка не учитывает знаки. Если они обрабатываются по-разному, то сортировка учитывает знаки.
Учет символов кана
Учет символов кана применяется к японским символам кана Хирагана и Катакана. Если эти символы обрабатываются по-разному, то сортировка учитывает символы кана.
Учет ширины символов
Учет ширины символов определяет, будут ли однобайтовые символы (половина ширины) и те же символы, представленные в виде двухбайтовых символов (полная ширина), обрабатываться одинаково или по-разному. Если они обрабатываются по-разному, то сортировка учитывает ширину символов.
Базы данных, таблицы и столбцы с разными сортировками
В SQL Server можно создавать базы данных, таблицы и столбцы с разными сортировками. Это позволяет больше гибкости при сортировке и сравнении данных. Например:
CREATE DATABASE BIN COLLATE Latin1_General_BIN;
CREATE DATABASE CI_AI_KS COLLATE Latin1_General_CI_AI_KS;
CREATE DATABASE CS_AS_KS_WS COLLATE Latin1_General_CS_AS_KS_WS;
CREATE TABLE MyTable (
[Column1] CHAR(10) COLLATE Albanian_CI_AI_KS_WS NULL,
[Column2] CHAR(8) COLLATE Korean_Wansung_Unicode_CS_AS_KS NOT NULL,
[Column3] CHAR(2) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
);
Сравнение символов с разными сортировками
При сравнении символов в базах данных с разными сортировками результаты могут отличаться. Например:
DECLARE @Char1 CHAR(1);
DECLARE @Char2 CHAR(1);
SET @Char1 = 'A';
SET @Char2 = 'a';
IF @Char1 = @Char2
PRINT 'A и a обрабатываются одинаково';
ELSE
PRINT 'A и a обрабатываются по-разному';
IF @Char1 = @Char2
PRINT 'A и á обрабатываются одинаково';
ELSE
PRINT 'A и á обрабатываются по-разному';
Результаты приведенного выше кода будут отличаться в зависимости от используемой сортировки.
Симуляция учета регистра
В некоторых случаях может потребоваться симулировать учет регистра в базе данных, не учитывающей регистр. Это можно сделать с помощью функции ASCII или типа данных varbinary. Например:
DECLARE @String1 VARCHAR(10);
DECLARE @String2 VARCHAR(10);
SET @String1 = 'Good';
SET @String2 = 'gooD';
IF ASCII(@String1) = ASCII(@String2)
PRINT 'Good и gooD обрабатываются одинаково';
ELSE
PRINT 'Good и gooD обрабатываются по-разному';
-- ИЛИ --
IF CAST(@String1 AS VARBINARY) = CAST(@String2 AS VARBINARY)
PRINT 'Good и gooD обрабатываются одинаково';
ELSE
PRINT 'Good и gooD обрабатываются по-разному';
Используя эти методы, можно достичь желаемого учета регистра даже в сортировке, не учитывающей регистр.
Понимание сортировки в SQL Server является важным для точной сортировки и сравнения данных. Выбирая соответствующую сортировку для ваших баз данных, таблиц и столбцов, вы можете обеспечить последовательные и надежные результаты.