Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Đối chiếu trong SQL Server

Giới thiệu

Bạn hẳn đã nghe đến thuật ngữ “Collation” trong SQL Server. Đối chiếu là một cấu hình xác định cách thức sắp xếp dữ liệu ký tự được thực hiện. Đây là một cài đặt quan trọng có tác động rất lớn đến cách công cụ cơ sở dữ liệu SQL Server hoạt động trong việc xử lý dữ liệu ký tự. Trong bài viết này, chúng tôi mong muốn thảo luận về các ảnh ghép nói chung và đưa ra một vài ví dụ về cách xử lý các ảnh ghép.

Tôi tìm các đối chiếu ở đâu?

Bạn có thể tìm thấy đối chiếu SQL ở cấp máy chủ, cơ sở dữ liệu và cột. Một điều quan trọng khác cần biết là cài đặt đối chiếu không cần phải giống nhau ở cấp máy chủ, cơ sở dữ liệu và cột. Ngoài ra, bạn có thể cập nhật các truy vấn của mình để sử dụng các đối chiếu cụ thể. Tại thời điểm này, bạn sẽ nhận ra tầm quan trọng của việc định cấu hình đối chiếu chính xác trong môi trường của bạn vì có nhiều khả năng xảy ra sự cố không mong muốn nếu đối chiếu không nhất quán.

Có những loại hình ghép nào khác nhau?

Bạn có thể nhận được danh sách đầy đủ các đối chiếu có sẵn bằng cách truy vấn hàm hệ thống sys.fn_helpcollations ()

select * from sys.fn_helpcollations()

Điều này sẽ trả về kết quả sau.

Nếu bạn đang tìm kiếm các đối chiếu cụ thể theo ngôn ngữ, bạn có thể lọc thêm tên. Ví dụ:nếu bạn đang tìm kiếm đối chiếu được hỗ trợ bằng ngôn ngữ Maori, bạn có thể sử dụng truy vấn sau.

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

Điều này sẽ trả về kết quả sau.

Bằng cách này, bạn có thể kiểm tra các đối chiếu được hỗ trợ cho đối chiếu mà bạn lựa chọn. Chỉ khi truy vấn hàm hệ thống fn_helpcollations (), tổng cộng 5508 hàng đã được trả về nghĩa là có rất nhiều đối chiếu được hỗ trợ. Lưu ý rằng điều này bao gồm phần lớn các ngôn ngữ trên thế giới.

Các tùy chọn khác nhau mà bạn thấy trong tên đối chiếu là gì?

Ví dụ:trong đối chiếu này:Maori_100_CS_AI_KS_WS_SC_UTF8, bạn có thể thấy các tùy chọn khác nhau trong tên đối chiếu.

CS - phân biệt chữ hoa chữ thường
AI - giọng không nhạy cảm
KS - phân biệt kiểu kana
WS -
SC nhạy cảm với chiều rộng - ký tự bổ sung
UTF8 - Chuẩn mã hóa
Dựa trên loại tùy chọn đối chiếu đã chọn, công cụ cơ sở dữ liệu SQL Server sẽ hoạt động khác nhau trong việc xử lý dữ liệu ký tự cho các hoạt động sắp xếp và tìm kiếm. Ví dụ:nếu bạn sử dụng tùy chọn phân biệt chữ hoa chữ thường trong đối chiếu SQL, công cụ cơ sở dữ liệu sẽ hoạt động khác với thao tác truy vấn tìm kiếm “Adam” hoặc “adam”. Giả sử bạn có một bảng được gọi là "mẫu" và có một cột tên với người dùng là "adam". Truy vấn bên dưới sẽ không trả về kết quả nếu không có hàng nào có tên đầu tiên là “Adam”. Điều này là do tùy chọn "CS-Phân biệt chữ hoa chữ thường" trong đối chiếu.

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

Với ví dụ đơn giản này, bạn có thể hiểu tầm quan trọng của việc chọn tùy chọn đối chiếu SQL chính xác. Đảm bảo rằng bạn hiểu các yêu cầu ứng dụng trước khi chọn đối chiếu ngay từ đầu.

Tìm đối chiếu trên phiên bản SQL Server

Bạn có thể lấy đối chiếu máy chủ trong SQL Server Management Studio (SSMS) bằng cách nhấp chuột phải vào phiên bản SQL, sau đó nhấp vào tùy chọn “Thuộc tính” và chọn tab “Chung”. Đối chiếu này được chọn theo mặc định khi cài đặt SQL Server.

Ngoài ra, bạn có thể sử dụng tùy chọn serverproperty để tìm giá trị đối chiếu.

select SERVERPROPERTY('collation'),

Tìm đối chiếu của cơ sở dữ liệu SQL

Trong SSMS, nhấp chuột phải vào cơ sở dữ liệu SQL và đi tới “Thuộc tính”. Bạn có thể kiểm tra chi tiết đối chiếu trong tab "Chung" như được hiển thị bên dưới.

Ngoài ra, bạn có thể sử dụng hàm databasepropertyex để lấy thông tin chi tiết về đối chiếu cơ sở dữ liệu.

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

Tìm đối chiếu của một cột trong bảng

Trong SSMS, chuyển đến bảng, sau đó đến các cột và cuối cùng nhấp chuột phải vào từng cột riêng lẻ để xem “Thuộc tính”. Nếu cột có kiểu dữ liệu ký tự, bạn sẽ thấy chi tiết của đối chiếu.

Tuy nhiên, đồng thời, nếu bạn kiểm tra giá trị cho kiểu dữ liệu không phải ký tự, giá trị đối chiếu sẽ là null. Dưới đây là ảnh chụp màn hình của một cột có kiểu dữ liệu int.

Ngoài ra, bạn có thể sử dụng truy vấn mẫu bên dưới để xem các giá trị đối chiếu cho các cột.

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

Dưới đây là đầu ra cho truy vấn.

Thử các đối chiếu khác nhau trong truy vấn SQL

Trong phần này, chúng ta sẽ xem thứ tự sắp xếp bị ảnh hưởng như thế nào khi các đối chiếu khác nhau được sử dụng trong các truy vấn. Một bảng mẫu được tạo với 2 cột như hình dưới đây.

Cột fname có đối chiếu mặc định của cơ sở dữ liệu mà nó thuộc về. Trong trường hợp này, đối chiếu là SQL_Latin1_General_CP1_CI_AS.
Để chèn một vài bản ghi trong bảng, hãy sử dụng truy vấn bên dưới. Gán các giá trị của riêng bạn cho các tham số.

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')

Bây giờ, hãy truy vấn bảng emp và sắp xếp nó theo cột fname bằng cách sử dụng các đối chiếu khác nhau. Chúng tôi sẽ sử dụng đối chiếu mặc định của cột để sắp xếp cũng như đối chiếu phân biệt chữ hoa chữ thường khác - 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

Đầu ra cho các truy vấn này được đưa ra bên dưới. Lưu ý sự khác biệt trong đối chiếu được sử dụng. Chúng tôi đang sử dụng phân biệt chữ hoa chữ thường thay vì phân biệt chữ hoa chữ thường.

Bạn cũng có thể kiểm tra các kế hoạch truy vấn cho cả hai truy vấn này để phát hiện sự khác biệt. Trong kế hoạch truy vấn đầu tiên, nơi chúng tôi sử dụng đối chiếu khác với đối chiếu trong cột, bạn có thể nhận thấy toán tử “Tính vô hướng” bổ sung.

Khi bạn di chuột qua toán tử “Tính toán vô hướng”, bạn sẽ thấy các chi tiết bổ sung như được hiển thị bên dưới. Điều này là do chuyển đổi ngầm đang diễn ra khi chúng tôi đang sử dụng đối chiếu khác với đối chiếu mặc định được sử dụng trong cột.

Với ví dụ nhỏ này, bạn có thể thấy loại tác động đến hiệu suất truy vấn khi bạn sử dụng đối chiếu một cách rõ ràng trong truy vấn. Trong cơ sở dữ liệu demo của chúng tôi, chúng tôi đã sử dụng một bảng đơn giản nhưng hãy tưởng tượng một kịch bản thời gian thực trong đó những thay đổi nhỏ trong hiệu suất truy vấn có thể gây ra kết quả không mong muốn.

Kiểm tra xem có thể thay đổi đối chiếu ở cấp phiên bản hay không

Trong phần này, chúng tôi sẽ xem xét các tình huống khác nhau mà chúng tôi có thể phải thay đổi các đối chiếu mặc định. Bạn có thể gặp phải các tình huống, khi máy chủ hoặc cơ sở dữ liệu được bàn giao cho bạn và chúng có thể không đáp ứng các chính sách tiêu chuẩn của bạn, vì vậy bạn có thể cần phải thay đổi đối chiếu. Đối chiếu SQL Server mặc định là SQL_Latin1_General_CP1_CI_AS. Thay đổi đối chiếu ở cấp phiên bản SQL không phải là ngay lập tức. Nó yêu cầu viết kịch bản cho tất cả các đối tượng trong cơ sở dữ liệu người dùng, xuất dữ liệu, loại bỏ cơ sở dữ liệu người dùng, xây dựng lại cơ sở dữ liệu chính với đối chiếu mới, tạo cơ sở dữ liệu người dùng và sau đó nhập tất cả dữ liệu. Vì vậy, nếu bạn đang cài đặt các phiên bản SQL mới, chỉ cần đảm bảo rằng bạn nhận được đối chiếu ngay lần đầu tiên, nếu không, bạn có thể phải thực hiện nhiều công việc không mong muốn sau này. Giải thích chi tiết các giai đoạn để thay đổi đối chiếu ở cấp cá thể nằm ngoài phạm vi của bài viết này do các bước chi tiết được yêu cầu cho từng giai đoạn.

Thay đổi đối chiếu ở cấp cơ sở dữ liệu

May mắn thay, việc thay đổi đối chiếu mức cơ sở dữ liệu không khó bằng việc thay đổi đối chiếu phiên bản. Chúng tôi có thể cập nhật đối chiếu bằng cả SSMS và T-SQL. Trong SSMS, chỉ cần nhấp chuột phải vào cơ sở dữ liệu, đi tới “Thuộc tính” và nhấp vào tab “Tùy chọn” ở phía bên trái. Tại đó, bạn có thể xem tùy chọn để thay đổi đối chiếu trong trình đơn thả xuống.

Nhấp vào “OK” sau khi hoàn tất. Tôi vừa thay đổi đối chiếu cơ sở dữ liệu thành SQL_Latin1_General_CP1_CI_AS. Chỉ cần đảm bảo rằng bạn thực hiện thao tác này khi cơ sở dữ liệu không được sử dụng vì nếu không thì thao tác sẽ không thành công như được hiển thị bên dưới.

Sử dụng truy vấn tiếp tục để thay đổi đối chiếu cơ sở dữ liệu bằng T-SQL.

USE master;  
GO  
ALTER DATABASE mo  
COLLATE SQL_Latin1_General_CP1_CS_AS;  
GO

Bạn sẽ nhận thấy rằng việc thay đổi đối chiếu mức cơ sở dữ liệu sẽ không ảnh hưởng đến đối chiếu của các cột hiện có trong bảng. Bạn có thể sử dụng các ví dụ trước đó để kiểm tra tác động của đối chiếu đối với thứ tự sắp xếp cho các truy vấn bên dưới.

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

Đối chiếu cột tên sẽ vẫn là nguyên gốc và sẽ không thay đổi ngay cả sau khi thay đổi đối chiếu cấp cơ sở dữ liệu.

Tuy nhiên, đối chiếu mức cơ sở dữ liệu mới sẽ được áp dụng cho tất cả các cột mới trong bảng mới mà bạn sẽ tạo. Vì vậy, hãy luôn kiểm tra kỹ lưỡng sự thay đổi của các đối chiếu cơ sở dữ liệu vì nó có tác động đáng kể đến đầu ra hoặc hành vi truy vấn.

Thay đổi đối chiếu ở cấp cột

Trong phần trước, bạn nhận thấy rằng ngay cả sau khi thay đổi đối chiếu mức cơ sở dữ liệu, đối chiếu của các cột hiện có trong bảng vẫn không thay đổi. Trong phần này, chúng ta sẽ thấy cách chúng ta có thể thay đổi đối chiếu của các cột hiện có trong bảng để phù hợp với đối chiếu của cơ sở dữ liệu. Trong phần trước, bạn đã thay đổi đối chiếu cơ sở dữ liệu thành SQL_Latin1_General_CP1_CS_AS. Tiếp theo, bạn muốn xác định tất cả các cột trong bảng người dùng không khớp với đối chiếu cơ sở dữ liệu này. Bạn có thể sử dụng tập lệnh này để xác định các cột đó.

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'

Kết quả mẫu từ cơ sở dữ liệu demo của tôi như được hiển thị bên dưới.

Giả sử bạn muốn thay đổi đối chiếu của cột fname hiện có thành “SQL_Latin1_General_CP1_CS_AS”, thì bạn có thể sử dụng tập lệnh thay thế này bên dưới.

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

Nếu bạn sử dụng các ví dụ trước đó trong đó bạn đã kiểm tra hiệu suất truy vấn bằng cách sử dụng các đối chiếu khác nhau, bạn sẽ nhận thấy rằng toán tử “tính toán vô hướng” không được sử dụng khi chúng ta sử dụng đối chiếu giống như đối chiếu của cơ sở dữ liệu. Tham khảo ảnh chụp màn hình bên dưới. Trong ví dụ trước, bạn có thể nhận thấy toán tử “Tính toán vô hướng” được sử dụng trong kế hoạch thực thi đầu tiên. Vì chúng tôi đã thay đổi đối chiếu cột để phù hợp với đối chiếu cơ sở dữ liệu, nên không cần chuyển đổi ngầm định. Bạn sẽ thấy toán tử “Tính toán vô hướng” trong truy vấn thứ hai vì nó sử dụng một đối chiếu khác một cách rõ ràng.

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

Chúng ta có thể thay đổi đối chiếu của cơ sở dữ liệu hệ thống không?

Không thể thay đổi đối chiếu của cơ sở dữ liệu hệ thống. Nếu bạn cố gắng thay đổi đối chiếu của cơ sở dữ liệu hệ thống - chính, mô hình, msdb hoặc tempdb, bạn sẽ nhận được thông báo lỗi này.

Bạn sẽ cần làm theo các bước được nêu trước đó về việc thay đổi đối chiếu ở cấp phiên bản SQL Server để thay đổi đối chiếu của cơ sở dữ liệu hệ thống. Điều quan trọng là làm cho các đối chiếu chính xác trong lần đầu tiên bạn cài đặt SQL Server để tránh những vấn đề như vậy.

Sự cố đã biết về xung đột đối chiếu

Một vấn đề phổ biến khác mà bạn có thể tìm thấy là lỗi liên quan đến xung đột đối chiếu, đặc biệt là khi sử dụng các đối tượng tạm thời. Các đối tượng tạm thời được lưu trữ trong tempdb. Tempdb là một cơ sở dữ liệu hệ thống sẽ giả sử đối chiếu của phiên bản SQL. Khi bạn tạo cơ sở dữ liệu người dùng có đối chiếu khác với cơ sở dữ liệu SQL, bạn sẽ gặp sự cố khi sử dụng các đối tượng tạm thời. Bạn cũng có thể gặp sự cố khi so sánh các cột trong bảng có các đối chiếu khác nhau. Bây giờ, bạn đã biết rằng một bảng có thể có các cột với các đối chiếu khác nhau vì chúng ta không thể thay đổi đối chiếu ở cấp bảng. Thông báo lỗi phổ biến mà bạn sẽ nhận thấy là "Không thể giải quyết xung đột đối chiếu giữa" Collation1 "và" Collation2 "trong hoạt động ngang bằng." Collation1 và Collation2 có thể là bất kỳ đối chiếu nào được sử dụng trong một truy vấn. Sử dụng một ví dụ đơn giản, chúng ta có thể tạo bản demo về xung đột đối chiếu này. Nếu bạn đã hoàn thành các ví dụ trước trong bài viết này, bạn sẽ có một bảng có tên “emp”. Chỉ cần tạo một bảng tạm thời trong cơ sở dữ liệu demo của bạn và chèn các bản ghi bằng cách sử dụng tập lệnh mẫu được cung cấp.

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

insert into  #emptemp
select * from emp

Chỉ cần chạy một phép nối bằng cả hai bảng và bạn sẽ gặp lỗi xung đột đối chiếu này như được hiển thị bên dưới.

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

Bạn sẽ nhận thấy rằng đối chiếu cơ sở dữ liệu người dùng được sử dụng là “SQL_Latin1_General_CP1_CS_AS” và nó không khớp với đối chiếu máy chủ. Để khắc phục loại lỗi này, bạn có thể thay đổi các cột được sử dụng trong các đối tượng tạm thời để sử dụng đối chiếu mặc định của cơ sở dữ liệu người dùng. Bạn có thể sử dụng tùy chọn “database_default” hoặc cung cấp rõ ràng tên đối chiếu của cơ sở dữ liệu người dùng. Trong ví dụ này, chúng tôi sử dụng đối chiếu “SQL_Latin1_General_CP1_CS_AS”. Hãy thử một trong các tùy chọn này
Tùy chọn 1: Sử dụng tùy chọn database_default

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

Sau khi hoàn tất, hãy chạy lại câu lệnh select và lỗi sẽ được sửa.
Tùy chọn 2: Sử dụng đối chiếu cơ sở dữ liệu người dùng một cách rõ ràng

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

Sau khi hoàn tất, hãy chạy lại câu lệnh select và lỗi sẽ được sửa.

Kết luận

Trong bài viết này, bạn đã tìm thấy về:
• khái niệm đối chiếu
• các tùy chọn đối chiếu khác nhau có sẵn
• tìm chi tiết đối chiếu cho bất kỳ phiên bản, cơ sở dữ liệu và cột SQL nào
• A VÍ DỤ LÀM VIỆC về việc thử các tùy chọn đối chiếu trong truy vấn SQL
• thay đổi đối chiếu ở cấp phiên bản, cấp cơ sở dữ liệu và cấp cột
• CÁCH thay đổi đối chiếu của cơ sở dữ liệu hệ thống
• xung đột đối chiếu và cách thức để sửa nó

Bây giờ bạn đã biết về tầm quan trọng của đối chiếu và tầm quan trọng của việc định cấu hình đối chiếu chính xác trên cá thể SQL và cả trên các đối tượng cơ sở dữ liệu. Luôn kiểm tra các tình huống khác nhau trong môi trường thử nghiệm của bạn trước khi áp dụng bất kỳ tùy chọn nào ở trên trên hệ thống sản xuất của bạn.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách SET ROWCOUNT hoạt động trong SQL Server

  2. Nhập SSIS Excel Buộc Loại cột Không chính xác

  3. Làm thế nào để xóa (ngăn chặn SQL injection) động SQL trong SQL Server?

  4. Thực thi Truy vấn động với go in sql

  5. Ý nghĩa của 1/1/1753 trong SQL Server là gì?