Books and articles about SQL Rambler's Top100 Сменить язык на: Русский 25 April 2024 13:19:26


www.sql-ex.ru
Skip Navigation Links  

 

Print  Версия для печати

На главную страницу

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

На главную страницу

Print  Версия для печати


Usage of any materials of this site is possible
only under condition of mandatory allocation of the direct link to a site
http://www.sqlbooks.ru
on each page where used materials are placed.

 Main   Articles    Books 
Рейтинг@Mail.ru Rambler's Top100 Alt Упражнения по SQL: обучение, тестирование, сертификация по языку SQL Copyright c 2002-2006. All rights reserved.