Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Съпоставяне в SQL Server

Въведение

Сигурно вече сте чували термина „Колиране“ в SQL Server. Съпоставянето е конфигурация, която определя как се извършва сортирането на знаци. Това е важна настройка, която има огромно влияние върху начина, по който двигателят на базата данни на SQL Server се държи при работа с данни за символи. В тази статия се стремим да обсъдим съпоставянията като цяло и да покажем няколко примера за работа със съпоставянията.

Къде да намеря съпоставяния?

Можете да намерите SQL съпоставяне на ниво сървър, база данни и колона. Друго важно нещо, което трябва да знаете, е, че настройката за съпоставяне не трябва да е еднаква на ниво сървър, база данни и колона. Освен това можете да актуализирате заявките си, за да използвате специфични съпоставяния. Точно в този момент ще осъзнаете колко е важно да конфигурирате правилното съпоставяне във вашата среда, тъй като има голяма вероятност от неочаквани проблеми, ако съпоставянето не е последователно.

Какви са наличните различни типове съпоставяния?

Можете да получите пълния списък с налични съпоставяния, като потърсите системната функция sys.fn_helpcollations()

select * from sys.fn_helpcollations()

Това ще върне следния изход.

Ако търсите конкретни съпоставяния по език, можете да филтрирате името допълнително. Например, ако търсите съпоставяне, поддържано от маорски език, можете да използвате следната заявка.

select * from sys.fn_helpcollations()
    where name like '%Maori%'

Това ще върне следния изход.

По този начин можете да проверите за поддържаните съпоставяния за съпоставянето по ваш избор. Само при запитване на системната функция fn_helpcollations() бяха върнати общо 5508 реда, което означава, че има толкова много поддържани съпоставяния. Имайте предвид, че това обхваща повечето от езиците по света.

Какви са различните опции, които виждате в името на съпоставянето?

Например в това съпоставяне:Maori_100_CS_AI_KS_WS_SC_UTF8 можете да видите различните опции в името на съпоставянето.

CS – регистри
AI – нечувствителен на акцент
КС – кана тип-чувствителни
WS – чувствителен на ширина
SC – допълнителни знаци
UTF8 – Стандарт за кодиране
Въз основа на типа на избраната опция за съпоставяне, механизмът на базата данни на SQL Server ще работи различно при работа с данни за символи за операции за сортиране и търсене. Например, ако използвате опцията, чувствителна към малки и големи букви в SQL съпоставянето, машината на базата данни ще се държи различно за операция на заявка, търсеща „Адам“ или „адам“. Ако приемем, че имате таблица, наречена „извадка“ и има колона с първо име с потребител „adam“. Заявката по-долу няма да върне резултати, ако няма ред с име „Адам“. Това се дължи на опцията „CS-Case sensitive“ в съпоставянето.

select * from sample
    where firstname like '%Adam%'

С този прост пример можете да разберете значението на избора на правилната опция за съпоставяне на SQL. Уверете се, че разбирате изискванията на приложението, преди да изберете съпоставяне на първо място.

Намиране на съпоставяне в екземпляр на SQL Server

Можете да получите съпоставянето на сървъра в SQL Server Management Studio (SSMS), като щракнете с десния бутон върху SQL екземпляра, след това щракнете върху опцията „Свойства“ и отметнете раздела „Общи“. Това съпоставяне се избира по подразбиране при инсталирането на SQL Server.

Като алтернатива можете да използвате опцията serverproperty, за да намерите стойността за съпоставяне.

select SERVERPROPERTY('collation'),

Намиране на съпоставяне на SQL база данни

В SSMS щракнете с десния бутон върху SQL базата данни и отидете на „Свойства“. Можете да проверите подробностите за съпоставяне в раздела „Общи“, както е показано по-долу.

Като алтернатива можете да използвате функцията databasepropertyex, за да получите подробности за съпоставяне на база данни.

select DATABASEPROPERTYEX('Your DB Name','collation')

Намиране на сортиране на колона в таблица

В SSMS отидете на таблицата, след това колони и накрая щракнете с десния бутон върху отделните колони, за да видите „Свойства“. Ако колоната е от символен тип данни, ще видите подробности за съпоставянето.

Въпреки това, в същото време, ако проверите стойността за несимволен тип данни, стойността за съпоставяне ще бъде нула. По-долу е екранна снимка на колона, която има тип данни тип int.

Като алтернатива можете да използвате примерна заявка по-долу, за да видите стойностите за съпоставяне за колони.

select sc.name, sc.collation_name from sys.columns sc
inner join sys.tables t on sc.object_id=t.object_id
where t.name='t1' – enter your table name

По-долу е изходът за заявката.

Изпробване на различни съпоставяния в SQL заявки

В този раздел ще видим как се влияе редът на сортиране, когато в заявките се използват различни съпоставяния. Създава се примерна таблица с 2 колони, както е показано по-долу.

Колоната fname има съпоставянето по подразбиране на базата данни, към която принадлежи. В този случай съпоставянето е SQL_Latin1_General_CP1_CI_AS.
За да вмъкнете няколко записа в таблицата, използвайте заявка по-долу. Задайте свои собствени стойности на параметрите.

insert into emp
  values (1,'mohammed')
  insert into emp 
  values (2,'moinudheen')
  insert into emp
  values (3,'Mohammed')
  insert into emp
  values (4,'Moinudheen')
  insert into emp
  values (5,'MOHAMMED')
  insert into emp
  values (6,'MOINUDHEEN')

Сега потърсете таблицата emp и я сортирайте по колоната fname, като използвате различни съпоставяния. Ще използваме съпоставянето по подразбиране на колоната за сортиране, както и друго съпоставяне, чувствително към главни букви – SQL_Latin1_General_CP1_CS_AS.

select * from emp order by fname collate SQL_Latin1_General_CP1_CS_AS 
select * from emp order by fname collate SQL_Latin1_General_CP1_CI_AS – this is default

Резултатът за тези заявки е даден по-долу. Забележете разликата в използваното съпоставяне. Използваме регистри и малки букви вместо без значение.

Можете също да проверите плановете за заявки и за двете заявки, за да забележите разликата. В първия план за заявка, където използваме различно съпоставяне от това в колоната, можете да забележите допълнителния оператор „Compute Scalar“.

Когато задържите курсора на мишката върху оператора „Compute Scalar“, ще видите допълнителните подробности, както е показано по-долу. Това се дължи на имплицитното преобразуване, което се извършва, тъй като използваме съпоставяне, различно от това по подразбиране, използвано в колоната.

С този малък пример можете да видите вида влияние върху производителността на заявката, когато използвате изрично съпоставяне в заявките. В нашата демонстрационна база данни използвахме проста таблица, но си представете сценарий в реално време, при който малки промени в производителността на заявката могат да доведат до неочаквани резултати.

Проверка дали е възможно да се промени съпоставянето на ниво екземпляр

В този раздел ще прегледаме различни сценарии, при които може да се наложи да променим съпоставянията по подразбиране. Може да срещнете ситуации, когато сървъри или бази данни ви бъдат предадени и те може да не отговарят на вашите стандартни политики, така че може да се наложи да промените съпоставянето. Съпоставянето на SQL Server по подразбиране е SQL_Latin1_General_CP1_CI_AS. Промяната на съпоставянето на ниво SQL екземпляр не е проста. Изисква скриптиране на всички обекти в потребителските бази данни, експортиране на данните, премахване на потребителските бази данни, възстановяване на основната база данни с новото съпоставяне, създаване на потребителски бази данни и след това импортиране на всички данни. Така че, ако инсталирате нови SQL екземпляри, просто се уверете, че сте получили съпоставянето правилно от първия път, в противен случай може да се наложи да вършите много нежелана работа по-късно. Подробното обяснение на етапите за промяна на съпоставянето на ниво екземпляр е извън обхвата на тази статия поради подробните стъпки, необходими за всеки от етапите.

Промяна на съпоставянето на ниво база данни

За щастие промяната на съпоставянето на ниво база данни не е толкова трудна, колкото промяната на съпоставянето на екземпляра. Можем да актуализираме съпоставянето, използвайки както SSMS, така и T-SQL. В SSMS просто щракнете с десния бутон върху базата данни, отидете на „Свойства“ и щракнете върху раздела „Опции“ от лявата страна. Там можете да видите опцията за промяна на сортирането в падащото меню.

Щракнете върху „OK“, след като сте готови. Току-що промених съпоставянето на базата данни на SQL_Latin1_General_CP1_CI_AS. Просто се уверете, че изпълнявате тази операция, когато базата данни не се използва, тъй като в противен случай операцията ще се провали, както е показано по-долу.

Използвайте продължаващата заявка, за да промените съпоставянето на базата данни с помощта на T-SQL.

USE master;  
GO  
ALTER DATABASE mo  
COLLATE SQL_Latin1_General_CP1_CS_AS;  
GO

Ще забележите, че промяната на съпоставянето на ниво база данни няма да повлияе на съпоставянето на съществуващите колони в таблиците. Можете да използвате по-ранните примери, за да проверите влиянието на съпоставянето върху реда на сортиране за заявките по-долу.

select * from emp order by fname collate SQL_Latin1_General_CP1_CS_AS 
select * from emp order by fname collate SQL_Latin1_General_CP1_CI_AS – - this is default

Съпоставянето на колона fname ще остане оригиналното и ще остане непроменено дори след промяна на съпоставянето на ниво база данни.

Въпреки това, новото съпоставяне на ниво база данни ще бъде приложено за всички нови колони в новите таблици, които ще създадете. Така че, винаги тествайте внимателно промяната на съпоставянето на базата данни, тъй като тя оказва значително влияние върху изхода или поведението на заявките.

Промяна на сортирането на ниво колона

В предишния раздел забелязахте, че дори след промяна на съпоставянето на ниво база данни, съпоставянето на съществуващите колони в таблиците остава непроменено. В този раздел ще видим как можем да променим съпоставянето на съществуващите колони в таблиците, за да съответства на това на съпоставянето на базата данни. В предишния раздел променихте съпоставянето на базата данни на SQL_Latin1_General_CP1_CS_AS. След това искате да идентифицирате всички колони в потребителските таблици, които не съответстват на това съпоставяне на базата данни. Можете да използвате този скрипт за идентифициране на тези колони.

select so.name TableName,sc.name ColumnName, sc.collation_name CollationName from
sys.objects so inner join sys.columns sc on so.object_id=sc.object_id
where sc.collation_name!='SQL_Latin1_General_CP1_CS_AS' and so.[type] ='U'

Примерният изход от моята демонстрационна база данни е както е показано по-долу.

Да предположим, че искате да промените сортирането на съществуващата колона fname на „SQL_Latin1_General_CP1_CS_AS“, тогава можете да използвате този алтернативен скрипт по-долу.

use mo
go
ALTER TABLE dbo.emp ALTER COLUMN fname  
            nvarchar(20) COLLATE SQL_Latin1_General_CP1_CS_AS NULL;  
GO

Ако използвате предишните примери, в които сте проверили производителността на заявката с помощта на различни съпоставяния, ще забележите, че операторът „изчисли скаларен“ не се използва, когато използваме същото съпоставяне като това на базата данни. Вижте екранната снимка по-долу. В предишния пример можеше да забележите, че операторът „Изчисли скаларен“ оператор се използва в първия план за изпълнение. Тъй като променихме съпоставянето на колони, за да съответства на това на съпоставянето на базата данни, няма нужда от имплицитно преобразуване. Ще видите оператора „Compute scalar“ във втората заявка, тъй като използва изрично различно съпоставяне.

select * from emp order by fname collate SQL_Latin1_General_CP1_CS_AS – - this is default
select * from emp order by fname collate SQL_Latin1_General_CP1_CI_AS

Можем ли да променим сортирането на системните бази данни?

Промяната на съпоставянето на системните бази данни не е възможна. Ако се опитате да промените сортирането на системните бази данни – master, model, msdb или tempdb, ще получите това съобщение за грешка.

Ще трябва да следвате стъпките, описани по-рано за промяна на съпоставянето на ниво екземпляр на SQL Server, за да промените съпоставянето на системните бази данни. Важно е да направите съпоставянето правилно първия път, когато инсталирате SQL Server, за да избегнете подобни проблеми.

Известният проблем за конфликта на съпоставяне

Друг често срещан проблем, който може да откриете, е грешката, свързана с конфликт на съпоставяне, особено при използване на временни обекти. Временните обекти се съхраняват в tempdb. tempdb, който е системна база данни, ще поеме съпоставянето на SQL екземпляра. Когато създавате потребителски бази данни, които имат съпоставяне, различно от това на SQL екземпляра, ще срещнете проблеми при използване на временни обекти. Може също да срещнете проблеми, докато сравнявате колони в таблици, които имат различни съпоставяния. Вече знаете, че една таблица може да има колони с различни съпоставяния, тъй като не можем да променим съпоставянето на ниво таблица. Често срещаното съобщение за грешка, което ще забележите, е нещо от рода на „Не може да се разреши конфликтът на съпоставяне между „Collation1“ и „Collation2“ в операцията за равно на“. Collation1 и Collation2 могат да бъдат всяко съпоставяне, използвано в заявка. Използвайки прост пример, можем да създадем демонстрация на този конфликт на съпоставяне. Ако сте завършили предишните примери в тази статия, вече ще имате таблица с име „emp“. Просто създайте временна таблица във вашата демонстрационна база данни и вмъкнете записи, като използвате предоставения примерен скрипт.

create table #emptemp
(id int,
 fname nvarchar(20))

insert into  #emptemp
select * from emp

Просто стартирайте обединяване с помощта на двете таблици и ще получите тази грешка в конфликта на съпоставянето, както е показано по-долу.

select e.id, et.fname 
from emp e inner join #emptemp et
on e.fname=et.fname

Ще забележите, че използваното съпоставяне на потребителска база данни е „SQL_Latin1_General_CP1_CS_AS“ и не съвпада с това на съпоставянето на сървъра. За да коригирате този тип грешка, можете да промените колоните, които се използват във временните обекти, за да използват съпоставянето по подразбиране на потребителската база данни. Можете да използвате опцията „database_default“ или изрично да предоставите името на съпоставяне на потребителската база данни. В този пример използваме съпоставянето „SQL_Latin1_General_CP1_CS_AS“. Опитайте една от тези опции
Опция 1: Използвайте опцията database_default

alter table #emptemp alter column
 fname nvarchar(20) collate database_default

След като приключите, изпълнете отново оператора select и грешката ще бъде коригирана.
Опция 2: Използвайте изрично съпоставянето на потребителската база данни

alter table #emptemp alter column
 fname nvarchar(20) collate SQL_Latin1_General_CP1_CS_AS

След като приключите, изпълнете отново оператора select и грешката ще бъде коригирана.

Заключение

В тази статия открихте за:
• концепцията за съпоставяне
• различните налични опции за съпоставяне
• намиране на детайли за съпоставяне за всеки SQL екземпляр, база данни и колона
• A РАБОТЕН ПРИМЕР за изпробване на опциите за съпоставяне в SQL заявки
• промяна на съпоставянията на ниво екземпляр, ниво на база данни и ниво на колона
• КАК ДА промените съпоставянията на системни бази данни
• конфликт на съпоставяне и как да го поправя

Сега знаете за важността на съпоставянето и критичността на конфигурирането на правилното съпоставяне в SQL екземпляр, а също и в обектите на базата данни. Винаги тествайте различните сценарии във вашата тестова среда, преди да приложите някоя от горните опции във вашите производствени системи.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да получите всички таблици със или без ограничение на първичния ключ в базата данни на Sql сървър - SQL Server / TSQL урок 59

  2. Как да свържете Python към SQL Server за автоматизиране на бекенд процес

  3. Ефективно преобразувайте редове в колони в sql сървър

  4. Как да използвате сортиране (Поръчайте по) в Select Statement в SQL Server - SQL Server / TSQL Урок, част 109

  5. Актуализирайте стойността на първичния ключ с помощта на рамката на обекта