На главную страницу
SQL Server и коллация
Muthusamy Anantha Kumar (оригинал:
SQL Server and Collation)
Перевод Моисеенко С.И.
Что такое collation?
Collation (сопоставление) определяет ряд правил, согласно которым сортируются и
сравниваются данные. Символьные данные сортируются, используя правила, которые
определяют правильную последовательность символов, в зависимости от регистра,
надстрочных знаков, символьных типов kana и ширины символов.
Чувствительность к регистру
Если A и a, B и b, и т.д. считаются одинаковыми, это называется независимостью
(нечувствительностью) от регистра. Компьютер считает A и a различными
символами, поскольку им соответствуют различные коды ASCII, позволяющие
различать ввод. ASCII-значение буквы A есть 65, в то время как a - 97.
ASCII-значение B - 66, а b - 98.
Чувствительность к акценту (надстрочным знакам)
Если a и á, o и ó трактуются одинаковыми, это называется
нечувствительностью к акценту. Компьютер считает a и á разными, поскольку
для них используются различные коды ASCII. ASCII значением символа a является
97, в то время как для á используется 225. Коды ASCII для o - 111, а
ó - 243.
Чувствительность Kana
Когда японские kana символы, Hiragana и Katakana, считаются разными, это
называют Kana чувствительностью.
Чувствительность к ширине
Когда однобайтный символ (полуширина) и тот же самый символ, представленный
двумя байтами (полная ширина), считаются разными, это называется
чувствительностью к ширине.
База данных, таблицы и столбцы с различной коллацией
SQL Server 2000 разрешает пользователям создавать базы данных, таблицы и столбцы
с различной коллацией.
Базы данных с различной коллацией
use master
go
create database BIN collate Latin1_General_BIN
go
create database CI_AI_KS collate Latin1_General_CI_AI_KS
go
create database CS_AS_KS_WS collate Latin1_General_CS_AS_KS_WS
go
Таблицы и столбцы с различной коллацией
Create table Mytable (
[colu] char(10) COLLATE Albanian_CI_AI_KS_WS NULL,
[Maydate] [char] (8) COLLATE Korean_Wansung_Unicode_CS_AS_KS NOT NULL,
[Risk_Rating] [char] (2) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
)
Сравнение символов в базах данных с различной коллацией
Когда мы запускаем нижеприведенный код на базах CI_AI_KS и CS_AS_KS_WS,
результаты будут совершенно различными.
declare @Accentvar1 char(1)
declare @Accentvar2 char(1)
declare @Casevar1 char(1)
declare @Casevar2 char(1)
set @casevar1 ='A'
set @casevar2 ='a'
set @Accentvar1 ='a'
set @Accentvar2 ='á'
if @casevar1 = @casevar2
begin
print "A и a считаются одинаковыми"
end
else
begin
print "A и a считаются разными"
end
if Accentvar1 = @Accentvar2
begin
print "A и á считаются одинаковыми"
end
else
begin
print " A и á считаются разными"
end
Когда мы выполнить эти операторы на базе данных CI_AI_KS, то получим следующие
результаты:
A и a считаются одинаковыми
A и á считаются одинаковыми
Когда мы выполняем эти операторы на базе данных CS_AS_KS_WS, результаты будут
такими:
A и a считаются разными
A и á считаются разными
Имитация чувствительности к регистру в случае нечувствительной к регистру базы
данных
Часто необходимо моделировать чувствительность к регистру в случае
нечувствительной к регистру базы данных. Пример ниже показывает, как Вы можете
этого добиться.
Use CI_AI_KS
go
declare @var1 varchar(10)
declare @var2 varchar(10)
set @var1 ='A'
set @var2 ='a'
if ASCII(@var1) = ASCII(@var2)
print " A и a считаются одинаковыми "
else
print " A и a считаются разными"
Однако, функция ASCII не может использоваться для слов. Чтобы достичь тех же
самых функциональных возможностей моделирования чувствительности к регистру, мы
можем использовать тип данных varbinary.
Use CI_AI_KS
go
declare @var1 varchar(10)
declare @var2 varchar(10)
set @var1 ='Good'
set @var2 ='gooD'
if cast(@var1 as varbinary) = cast(@var2 as varbinary)
print "Good и gooD считаются одинаковыми"
else
print "Good и gooD считаются разными"
Моделирование нечувствительности в случае чувствительной к регистру базы данных
Часто необходимо моделировать нечувствительность случая в случае чувствительной
к регистру базы данных. Пример ниже показывает, как Вы можете этого добиться:
Use CS_AS_KS_WS
go
declare @var1 varchar(10)
declare @var2 varchar(10)
set @var1 ='A'
set @var2 ='a'
if upper(@var1) = upper(@var2)
print "A и a считаются одинаковыми"
else
print "A и a считаются разными"
go
Use CS_AS_KS_WS
go
declare @var1 varchar(10)
declare @var2 varchar(10)
set @var1 ='Good'
set @var2 ='gooD'
if upper(@var1) = upper(@var2 )
print "Good и gooD считаются одинаковыми"
else
print "Good и gooD считаются разными"
Моделирование чувствительности к акценту в нечувствительной базе данных
Часто необходимо моделировать чувствительность к акценту для нечувствительной
базы данных:
Use CI_AI_KS
go
declare @var1 varchar(10)
declare @var2 varchar(10)
set @var1 ='A'
set @var2 = 'á'
if ASCII(@var1) = ASCII(@var2)
print "A и á считаются одинаковыми"
else
print "A и á не считаются одинаковыми "
Опять таки функция ASCII не может использоваться для слов. Чтобы достичь
аналогичных функциональных, как и при моделировании чувствительности к
регистру, мы можем использовать тип данных varbinary:
Use CI_AI_KS
go
declare @var1 varchar(10)
declare @var2 varchar(10)
set @var1 ='Gold'
set @var2 ='Góld'
if cast(@var1 as varbinary) = cast(@var2 as varbinary)
print " Gold и Góld считаются одинаковыми"
else
print " Gold и Góld считаются разными"
Изменение коллации
В SQL Server 7.0 Collation может быть установлена только на уровне сервера в
процессе инсталляции. Чтобы изменить коллацию, Вам необходимо перестроить базу
данных master. Она находится в каталоге Program Files\Microsoft SQL
Server\80\Tools\Binn.
В SQL Server 2000 Вы можете изменить коллацию на уровне базы данных и уровене
столбца, просто используя операторы alter.
Create database testNorwegian collate
Danish_Norwegian_CI_AI_KS
go
Alter database testNorwegian collate Danish_Norwegian_CI_AI
go
Create table Mytable (
[colu] char(10) COLLATE Albanian_CI_AI_KS_WS NULL,
[Maydate] [char] (8) COLLATE Korean_Wansung_Unicode_CS_AS_KS NOT NULL ,
[Risk_Rating] [char] (2) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
)
go
Alter table Mytable alter column [colu] char(10) COLLATE
Korean_Wansung_Unicode_CS_AS_KS NULL
go
Определение коллации текущего сервера
select SERVERPROPERTY ('collation')
Определение коллации указанной базы данных
select
convert(sysname,DatabasePropertyEx('CS_AS_KS_WS','Collation'))
Определение коллации текущей базы данных
select
convert(sysname,DatabasePropertyEx(db_name(),'Collation'))
Определение коллации всех столбцов в таблице
select name, collation from syscolumns where
[id]=object_id('Mytable')
Определение всех коллаций, имеющихся в SQL Server
select * from ::fn_helpcollations()
Заключение
В этой статье объясняется фундаментальное понятие коллации и ее использование.
Вы можете создать функции для моделирования нечувствительности к акценту в
чувствительной базе данных, сопоставляя a и á. Kana чувствительность и
чувствительность к ширине используются, главным образом, в азиатских языках.
28.01.2004
На главную страницу