Chuyển từ SQL 2005 [SQL_Latin1_General_CP1_CI_AS] sang 2008 - tôi sẽ mất bất kỳ tính năng nào bằng cách sử dụng 'khả năng tương thích ngược'


18

Chúng tôi đang chuyển từ SQL 2005 [Instance và DB có đối chiếu SQL_Latin1_General_CP1_CI_AS] sang SQL 2008 [mặc định là Latin1_General_CI_AS].

Tôi đã hoàn thành cài đặt SQL 2008 R2 và sử dụng Latin1_General_CI_ASđối chiếu mặc định , với việc khôi phục cơ sở dữ liệu vẫn bật SQL_Latin1_General_CP1_CI_AS. Các vấn đề ngoại lệ đã xảy ra - các bảng #temp trong Latin1_General_CI_ASkhi db đang ở SQL_Latin1_General_CP1_CI_ASvà đây là nơi tôi đang ở hiện tại - tôi cần tư vấn về những cạm bẫy ngay bây giờ.

Khi cài đặt SQL 2008 R2, tôi có tùy chọn cài đặt để sử dụng 'SQL Collation, used for backwards compatibility'trong đó tôi có tùy chọn để chọn đối chiếu giống như cơ sở dữ liệu năm 2005 : SQL_Latin1_General_CP1_CI_AS.

  1. Điều này sẽ cho phép tôi không gặp vấn đề với các bảng #temp, nhưng có cạm bẫy không?

  2. Tôi có thể mất bất kỳ chức năng hoặc tính năng nào dưới dạng không sử dụng đối chiếu "hiện tại" của SQL 2008 không?

  3. Còn khi chúng ta chuyển (ví dụ trong 2 năm) từ 2008 sang SQL 2012 thì sao? Tôi sẽ có vấn đề sau đó?
  4. Tôi đến một lúc nào đó sẽ bị buộc phải đi đến Latin1_General_CI_AS?

  5. Tôi đọc được rằng một số tập lệnh của DBA hoàn thành các hàng cơ sở dữ liệu hoàn chỉnh, và sau đó chạy tập lệnh chèn vào cơ sở dữ liệu với đối chiếu mới - tôi rất sợ và cảnh giác với điều này - bạn có khuyên bạn nên làm điều này không?


2
Nếu bạn nghĩ rằng bạn có thể vào Hekaton trong SQL Server 2014, thì đây là một thứ khác mà bạn có thể muốn xem xét việc đọc .
Aaron Bertrand

Câu trả lời:


20

Trước hết, xin lỗi vì một câu trả lời dài như vậy, vì tôi cảm thấy vẫn còn nhiều sự nhầm lẫn khi mọi người nói về các thuật ngữ như đối chiếu, sắp xếp thứ tự, trang mã, v.v.

Từ BOL :

Các bộ sưu tập trong SQL Server cung cấp các quy tắc sắp xếp, trường hợp và thuộc tính độ nhạy cho dữ liệu của bạn . Các bộ sưu tập được sử dụng với các loại dữ liệu ký tự, chẳng hạn như char và varchar ra lệnh trang mã và các ký tự tương ứng có thể được biểu diễn cho loại dữ liệu đó. Cho dù bạn đang cài đặt phiên bản SQL Server mới, khôi phục bản sao lưu cơ sở dữ liệu hoặc kết nối máy chủ với cơ sở dữ liệu máy khách, điều quan trọng là bạn phải hiểu các yêu cầu về ngôn ngữ, thứ tự sắp xếp và trường hợp và độ nhạy của dữ liệu mà bạn sẽ làm việc với .

Điều này có nghĩa là Collation rất quan trọng vì nó chỉ định các quy tắc về cách sắp xếp và so sánh các chuỗi ký tự của dữ liệu.

Lưu ý: Thông tin thêm về THU THẬP

Bây giờ, trước tiên hãy hiểu sự khác biệt ......

Chạy bên dưới T-SQL:

SELECT *
FROM::fn_helpcollations()
WHERE NAME IN (
        'SQL_Latin1_General_CP1_CI_AS'
        ,'Latin1_General_CI_AS'
        )
GO

SELECT 'SQL_Latin1_General_CP1_CI_AS' AS 'Collation'
    ,COLLATIONPROPERTY('SQL_Latin1_General_CP1_CI_AS', 'CodePage') AS 'CodePage'
    ,COLLATIONPROPERTY('SQL_Latin1_General_CP1_CI_AS', 'LCID') AS 'LCID'
    ,COLLATIONPROPERTY('SQL_Latin1_General_CP1_CI_AS', 'ComparisonStyle') AS 'ComparisonStyle'
    ,COLLATIONPROPERTY('SQL_Latin1_General_CP1_CI_AS', 'Version') AS 'Version'

UNION ALL

SELECT 'Latin1_General_CI_AS' AS 'Collation'
    ,COLLATIONPROPERTY('Latin1_General_CI_AS', 'CodePage') AS 'CodePage'
    ,COLLATIONPROPERTY('Latin1_General_CI_AS', 'LCID') AS 'LCID'
    ,COLLATIONPROPERTY('Latin1_General_CI_AS', 'ComparisonStyle') AS 'ComparisonStyle'
    ,COLLATIONPROPERTY('Latin1_General_CI_AS', 'Version') AS 'Version'
GO

Kết quả sẽ là:

nhập mô tả hình ảnh ở đây

Nhìn vào kết quả trên, sự khác biệt duy nhất là Thứ tự sắp xếp giữa 2 lần đối chiếu. Nhưng điều đó không đúng, bạn có thể thấy lý do tại sao như dưới đây:

Bài kiểm tra 1:

--Clean up previous query
IF OBJECT_ID('Table_Latin1_General_CI_AS') IS NOT NULL
    DROP TABLE Table_Latin1_General_CI_AS;

IF OBJECT_ID('Table_SQL_Latin1_General_CP1_CI_AS') IS NOT NULL
    DROP TABLE Table_SQL_Latin1_General_CP1_CI_AS;

-- Create a table using collation Latin1_General_CI_AS 
CREATE TABLE Table_Latin1_General_CI_AS (
    ID INT IDENTITY(1, 1)
    ,Comments VARCHAR(50) COLLATE Latin1_General_CI_AS
    )

-- add some data to it 
INSERT INTO Table_Latin1_General_CI_AS (Comments)
VALUES ('kin_test1')

INSERT INTO Table_Latin1_General_CI_AS (Comments)
VALUES ('Kin_Tester1')

-- Create second table using collation SQL_Latin1_General_CP1_CI_AS 
CREATE TABLE Table_SQL_Latin1_General_CP1_CI_AS (
    ID INT IDENTITY(1, 1)
    ,Comments VARCHAR(50) COLLATE SQL_Latin1_General_CP1_CI_AS
    )

-- add some data to it 
INSERT INTO Table_SQL_Latin1_General_CP1_CI_AS (Comments)
VALUES ('kin_test1')

INSERT INTO Table_SQL_Latin1_General_CP1_CI_AS (Comments)
VALUES ('Kin_Tester1')

--Now try to join both tables
SELECT *
FROM Table_Latin1_General_CI_AS LG
INNER JOIN Table_SQL_Latin1_General_CP1_CI_AS SLG ON LG.Comments = SLG.Comments
GO

Kết quả kiểm tra 1:

Msg 468, Level 16, State 9, Line 35
Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Latin1_General_CI_AS" in the equal to operation.

Từ các kết quả trên, chúng ta có thể thấy rằng chúng ta không thể so sánh trực tiếp các giá trị trên các cột với các đối chiếu khác nhau, bạn phải sử dụng COLLATEđể so sánh các giá trị cột.

KIỂM TRA 2:

Sự khác biệt chính là hiệu suất, như Erland Sommarskog chỉ ra tại cuộc thảo luận này trên msdn .

--Clean up previous query
IF OBJECT_ID('Table_Latin1_General_CI_AS') IS NOT NULL
    DROP TABLE Table_Latin1_General_CI_AS;

IF OBJECT_ID('Table_SQL_Latin1_General_CP1_CI_AS') IS NOT NULL
    DROP TABLE Table_SQL_Latin1_General_CP1_CI_AS;

-- Create a table using collation Latin1_General_CI_AS 
CREATE TABLE Table_Latin1_General_CI_AS (
    ID INT IDENTITY(1, 1)
    ,Comments VARCHAR(50) COLLATE Latin1_General_CI_AS
    )

-- add some data to it 
INSERT INTO Table_Latin1_General_CI_AS (Comments)
VALUES ('kin_test1')

INSERT INTO Table_Latin1_General_CI_AS (Comments)
VALUES ('kin_tester1')

-- Create second table using collation SQL_Latin1_General_CP1_CI_AS 
CREATE TABLE Table_SQL_Latin1_General_CP1_CI_AS (
    ID INT IDENTITY(1, 1)
    ,Comments VARCHAR(50) COLLATE SQL_Latin1_General_CP1_CI_AS
    )

-- add some data to it 
INSERT INTO Table_SQL_Latin1_General_CP1_CI_AS (Comments)
VALUES ('kin_test1')

INSERT INTO Table_SQL_Latin1_General_CP1_CI_AS (Comments)
VALUES ('kin_tester1')

--- Tạo chỉ mục trên cả hai bảng

CREATE INDEX IX_LG_Comments ON  Table_Latin1_General_CI_AS(Comments)
go
CREATE INDEX IX_SLG_Comments ON  Table_SQL_Latin1_General_CP1_CI_AS(Comments)

--- Chạy các truy vấn

DBCC FREEPROCCACHE
GO
SELECT Comments FROM Table_Latin1_General_CI_AS WHERE Comments = 'kin_test1'
GO

--- Điều này sẽ có chuyển đổi IMPLICIT

nhập mô tả hình ảnh ở đây

--- Chạy các truy vấn

DBCC FREEPROCCACHE
GO
SELECT Comments FROM Table_SQL_Latin1_General_CP1_CI_AS WHERE Comments = 'kin_test1'
GO

--- Điều này sẽ KHÔNG có chuyển đổi IMPLICIT

nhập mô tả hình ảnh ở đây

Lý do cho chuyển đổi ngầm là bởi vì, tôi có cả đối chiếu cơ sở dữ liệu & máy chủ của mình và cả SQL_Latin1_General_CP1_CI_ASbảng Table_Latin1_General_CI_AS có cột Nhận xét được xác định như VARCHAR(50)với COLLATE Latin1_General_CI_AS , do đó, trong quá trình tra cứu, SQL Server phải thực hiện chuyển đổi IMPLICIT.

Bài kiểm tra 3:

Với cùng một thiết lập, bây giờ chúng ta sẽ so sánh các cột varchar với các giá trị nvarchar để xem các thay đổi trong kế hoạch thực hiện.

- chạy truy vấn

DBCC FREEPROCCACHE
GO
SELECT Comments FROM Table_Latin1_General_CI_AS WHERE Comments =  (SELECT N'kin_test1' COLLATE Latin1_General_CI_AS)
GO

nhập mô tả hình ảnh ở đây

- chạy truy vấn

DBCC FREEPROCCACHE
GO
SELECT Comments FROM Table_SQL_Latin1_General_CP1_CI_AS WHERE Comments = N'kin_test1'
GO

nhập mô tả hình ảnh ở đây

Lưu ý rằng truy vấn đầu tiên có thể thực hiện tìm kiếm Index nhưng phải thực hiện chuyển đổi ngầm định trong khi truy vấn thứ hai thực hiện quét Index, điều này chứng tỏ là không hiệu quả về mặt hiệu suất khi nó sẽ quét các bảng lớn.

Phần kết luận :

  • Tất cả các thử nghiệm trên cho thấy rằng có đối chiếu đúng là rất quan trọng đối với trường hợp máy chủ cơ sở dữ liệu của bạn.
  • SQL_Latin1_General_CP1_CI_AS là đối chiếu SQL với các quy tắc cho phép bạn sắp xếp dữ liệu cho unicode và không unicode là khác nhau.
  • Đối chiếu SQL sẽ không thể sử dụng Index khi so sánh dữ liệu unicode và không unicode như đã thấy trong các thử nghiệm ở trên khi so sánh dữ liệu nvarchar với dữ liệu varchar, nó quét Index và không tìm kiếm.
  • Latin1_General_CI_AS là đối chiếu Windows với các quy tắc cho phép bạn sắp xếp dữ liệu cho unicode và không unicode là như nhau.
  • Đối chiếu Windows vẫn có thể sử dụng Index (Tìm kiếm chỉ mục trong ví dụ trên) khi so sánh dữ liệu unicode và không unicode nhưng bạn thấy một hình phạt hiệu suất nhẹ.
  • Rất khuyến khích đọc câu trả lời của Erland Sommarskog + các mục kết nối mà anh ta đã chỉ.

Điều này sẽ cho phép tôi không gặp vấn đề với các bảng #temp, nhưng có cạm bẫy không?

Xem câu trả lời của tôi ở trên.

Tôi có thể mất bất kỳ chức năng hoặc tính năng nào dưới dạng không sử dụng đối chiếu "hiện tại" của SQL 2008 không?

Tất cả phụ thuộc vào chức năng / tính năng mà bạn đang đề cập đến. Đối chiếu là lưu trữ và sắp xếp dữ liệu.

Còn khi chúng ta chuyển (ví dụ trong 2 năm) từ 2008 sang SQL 2012 thì sao? Tôi sẽ có vấn đề sau đó? Đến một lúc nào đó tôi có bị buộc phải đi đến Latin1_General_CI_AS không?

Không thể chứng từ! Vì mọi thứ có thể thay đổi và luôn luôn tốt khi được đề xuất với đề xuất của Microsoft + bạn cần hiểu dữ liệu của mình và những cạm bẫy mà tôi đã đề cập ở trên. Cũng tham khảo điều này và các mục kết nối này .

Tôi đọc được rằng một số tập lệnh của DBA hoàn thành các hàng cơ sở dữ liệu hoàn chỉnh, và sau đó chạy tập lệnh chèn vào cơ sở dữ liệu với đối chiếu mới - tôi rất sợ và cảnh giác với điều này - bạn có khuyên bạn nên làm điều này không?

Khi bạn muốn thay đổi đối chiếu, thì các kịch bản như vậy rất hữu ích. Tôi đã thấy mình thay đổi đối chiếu cơ sở dữ liệu để khớp với đối chiếu máy chủ nhiều lần và tôi có một số tập lệnh thực hiện khá gọn gàng. Hãy cho tôi biết nếu bạn cần nó.

Tài liệu tham khảo:


5

Ngoài những gì @Kin đã nêu chi tiết trong câu trả lời của mình , có một số điều nữa cần lưu ý khi chuyển đổi đối chiếu mặc định của máy chủ (ví dụ: các mục bên trên đường ngang có liên quan trực tiếp đến hai đối chiếu được đề cập trong Câu hỏi; các mục bên dưới đường ngang có liên quan đến chung):

  • NẾU THU THẬP NỀN TẢNG CỦA CƠ SỞ CỦA BẠN KHÔNG THAY ĐỔI, thì vấn đề hiệu suất "chuyển đổi ngầm" được mô tả trong câu trả lời của @ Kin không phải là vấn đề vì các chuỗi ký tự và biến cục bộ sử dụng Đối chiếu mặc định của Cơ sở dữ liệu, không phải của máy chủ. Các tác động duy nhất cho kịch bản trong đó Collation ở mức thể hiện được thay đổi nhưng không phải là Collation ở mức cơ sở dữ liệu (cả hai được mô tả chi tiết bên dưới):

    • đối chiếu tiềm năng xung đột với các bảng tạm thời (nhưng không phải là biến bảng).
    • mã bị hỏng tiềm ẩn nếu vỏ biến và / hoặc con trỏ không khớp với khai báo của chúng (nhưng điều này chỉ có thể xảy ra nếu chuyển sang một thể hiện có đối chiếu nhị phân hoặc phân biệt chữ hoa chữ thường).
  • Một điểm khác biệt giữa hai Collations này là cách chúng sắp xếp các ký tự nhất định cho VARCHARdữ liệu (điều này không ảnh hưởng đến NVARCHARdữ liệu). Các bộ sưu tập không phải EBCDIC SQL_sử dụng cái gọi là "Sắp xếp chuỗi" cho VARCHARdữ liệu, trong khi tất cả các Bộ sưu tập khác và thậm chí NVARCHARdữ liệu cho Bộ sưu tập không phải EBCDIC SQL_, sử dụng cái được gọi là "Sắp xếp từ". Sự khác biệt là trong "Sắp xếp từ", dấu gạch ngang -và dấu nháy đơn '(và có thể một vài ký tự khác?) Được cho trọng số rất thấp và về cơ bản bị bỏ qua trừ khi không có sự khác biệt nào trong chuỗi. Để xem hành vi này trong hành động, chạy như sau:

    DECLARE @Test TABLE (Col1 VARCHAR(10) NOT NULL);
    INSERT INTO @Test VALUES ('aa');
    INSERT INTO @Test VALUES ('ac');
    INSERT INTO @Test VALUES ('ah');
    INSERT INTO @Test VALUES ('am');
    INSERT INTO @Test VALUES ('aka');
    INSERT INTO @Test VALUES ('akc');
    INSERT INTO @Test VALUES ('ar');
    INSERT INTO @Test VALUES ('a-f');
    INSERT INTO @Test VALUES ('a_e');
    INSERT INTO @Test VALUES ('a''kb');
    
    SELECT * FROM @Test ORDER BY [Col1] COLLATE SQL_Latin1_General_CP1_CI_AS;
    -- "String Sort" puts all punctuation ahead of letters
    
    SELECT * FROM @Test ORDER BY [Col1] COLLATE Latin1_General_100_CI_AS;
    -- "Word Sort" mostly ignores dash and apostrophe

    Trả về:

    String Sort
    -----------
    a'kb
    a-f
    a_e
    aa
    ac
    ah
    aka
    akc
    am
    ar

    và:

    Word Sort
    ---------
    a_e
    aa
    ac
    a-f
    ah
    aka
    a'kb
    akc
    am
    ar

    Mặc dù bạn sẽ "mất" hành vi "Sắp xếp chuỗi", tôi không chắc chắn rằng tôi sẽ gọi đó là "tính năng". Đó là một hành vi được coi là không mong muốn (bằng chứng là nó không được đưa vào bất kỳ bộ sưu tập Windows nào). Tuy nhiên, đó một sự khác biệt nhất định về hành vi giữa hai lần đối chiếu (một lần nữa, chỉ đối với VARCHARdữ liệu không phải EBCDIC ) và bạn có thể có mã và / hoặc kỳ vọng của khách hàng dựa trên hành vi "Sắp xếp chuỗi". Điều này yêu cầu kiểm tra mã của bạn và có thể nghiên cứu để xem liệu thay đổi hành vi này có thể có bất kỳ tác động tiêu cực nào đối với người dùng hay không.

  • Một điểm khác biệt giữa SQL_Latin1_General_CP1_CI_ASLatin1_General_100_CI_ASlà khả năng để làm bản mở rộng trên VARCHARdữ liệu ( NVARCHARdữ liệu đã có thể làm những đối với hầu hết SQL_Collations), chẳng hạn như xử lý ænhư thể nó là ae:

    IF ('æ' COLLATE SQL_Latin1_General_CP1_CI_AS =
        'ae' COLLATE SQL_Latin1_General_CP1_CI_AS)
    BEGIN
      PRINT 'SQL_Latin1_General_CP1_CI_AS';
    END;
    
    IF ('æ' COLLATE Latin1_General_100_CI_AS =
        'ae' COLLATE Latin1_General_100_CI_AS)
    BEGIN
      PRINT 'Latin1_General_100_CI_AS';
    END;

    Trả về:

    Latin1_General_100_CI_AS

    Điều duy nhất bạn "mất" ở đây là không thể thực hiện những mở rộng này. Nói chung, đây là một lợi ích khác của việc chuyển sang Windows Collation. Tuy nhiên, giống như di chuyển "Sắp xếp chuỗi" sang "Sắp xếp từ", cũng có một sự thận trọng tương tự: đó là một sự khác biệt nhất định về hành vi giữa hai lần đối chiếu (một lần nữa, chỉ dành cho VARCHARdữ liệu) và bạn có thể có mã và / hoặc khách hàng kỳ vọng dựa trên việc không có những ánh xạ này. Điều này yêu cầu kiểm tra mã của bạn và có thể nghiên cứu để xem liệu thay đổi hành vi này có thể có bất kỳ tác động tiêu cực nào đối với người dùng hay không.

    (lần đầu tiên được ghi chú trong câu trả lời SO này của @Zarepheth: SQL Server SQL_Latin1_General_CP1_CI_AS có thể được chuyển đổi an toàn sang Latin1_General_CI_AS không? )

  • Đối chiếu ở cấp độ máy chủ được sử dụng để đặt đối chiếu cơ sở dữ liệu hệ thống, bao gồm [model]. Cơ [model]sở dữ liệu được sử dụng làm mẫu để tạo cơ sở dữ liệu mới, bao gồm [tempdb]mỗi lần khởi động máy chủ. Nhưng, ngay cả khi có sự thay đổi đối chiếu ở cấp độ máy chủ thay đổi đối chiếu [tempdb], có một cách dễ dàng để sửa lỗi cho sự khác biệt đối chiếu giữa cơ sở dữ liệu là "hiện tại" khi CREATE #TempTableđược thực thi và [tempdb]. Khi tạo các bảng tạm thời, hãy khai báo đối chiếu bằng COLLATEmệnh đề và chỉ định đối chiếu DATABASE_DEFAULT:

    CREATE TABLE #Temp (Col1 NVARCHAR(40) COLLATE DATABASE_DEFAULT);

  • Tốt nhất là sử dụng phiên bản mới nhất của đối chiếu mong muốn, nếu có nhiều phiên bản. Bắt đầu từ SQL Server 2005, một loạt các đối chiếu "90" đã được giới thiệu và SQL Server 2008 đã giới thiệu một loạt các đối chiếu "100". Bạn có thể tìm thấy các đối chiếu này bằng cách sử dụng các truy vấn sau:

    SELECT * FROM sys.fn_helpcollations() WHERE [name] LIKE N'%[_]90[_]%'; -- 476
    
    SELECT * FROM sys.fn_helpcollations() WHERE [name] LIKE N'%[_]100[_]%'; -- 2686

    Vì bạn đang sử dụng SQL Server 2008 R2, bạn nên sử dụng Latin1_General_100_CI_ASthay vì Latin1_General_CI_AS.

  • Sự khác biệt giữa các phiên bản phân biệt chữ hoa chữ thường của các đối chiếu cụ thể này (nghĩa là SQL_Latin1_General_CP1_CS_ASLatin1_General_100_CS_AS) là theo thứ tự chữ hoa và chữ thường khi thực hiện phân loại chữ hoa chữ thường. Điều này cũng ảnh hưởng đến phạm vi lớp ký tự đơn (nghĩa là [start-end]) có thể được sử dụng với LIKEtoán tử và PATINDEXhàm. Ba truy vấn sau đây cho thấy hiệu ứng này cho cả sắp xếp và phạm vi ký tự.:

    SELECT tmp.col AS [Upper-case first]
    FROM (VALUES ('a'), ('A'), ('b'), ('B'), ('c'), ('C')) tmp(col)
    WHERE tmp.col LIKE '%[A-C]%' COLLATE SQL_Latin1_General_CP1_CS_AS
    ORDER BY tmp.col COLLATE SQL_Latin1_General_CP1_CS_AS; -- Upper-case first
    
    SELECT tmp.col AS [Lower-case first]
    FROM (VALUES ('a'), ('A'), ('b'), ('B'), ('c'), ('C')) tmp(col)
    WHERE tmp.col LIKE '%[A-C]%' COLLATE Latin1_General_100_CS_AS
    ORDER BY tmp.col COLLATE Latin1_General_100_CS_AS; -- Lower-case first
    
    SELECT tmp.col AS [Lower-case first]
    FROM (VALUES (N'a'), (N'A'), (N'b'), (N'B'), (N'c'), (N'C')) tmp(col)
    WHERE tmp.col LIKE N'%[A-C]%' COLLATE SQL_Latin1_General_CP1_CS_AS
    ORDER BY tmp.col COLLATE SQL_Latin1_General_CP1_CS_AS; -- Lower-case first

    Cách duy nhất để viết hoa chữ thường sắp xếp trước chữ thường (cho cùng một chữ cái) là sử dụng một trong 31 Collations hỗ trợ hành vi đó, đó là Hungarian_Technical_*Collations và một số SQL_Collations (chỉ hỗ trợ hành vi này cho VARCHARdữ liệu ).

  • Ít quan trọng hơn đối với thay đổi cụ thể này, nhưng vẫn nên biết vì nó sẽ ảnh hưởng nếu thay đổi máy chủ thành đối chiếu nhị phân hoặc phân biệt chữ hoa chữ thường, là đối chiếu mức máy chủ cũng ảnh hưởng đến:

    • tên biến cục bộ
    • Tên HIỆN TẠI
    • Nhãn GOTO
    • tên độ phân giải của sysnamekiểu dữ liệu


    Có nghĩa là, nếu bạn hoặc "lập trình viên rời đi gần đây", người rõ ràng chịu trách nhiệm cho tất cả các mã xấu ;-) đã không cẩn thận về việc đặt và khai báo một biến như @SomethingIDsau đó, sau đó gọi nó là biến @somethingId, điều đó sẽ bị phá vỡ nếu chuyển sang một trường hợp đối chiếu nhạy cảm hoặc nhị phân. Tương tự, mã sử dụng sysnamekiểu dữ liệu nhưng gọi nó là SYSNAME, SysNamehoặc một cái gì đó không phải là tất cả chữ thường cũng sẽ bị phá vỡ nếu được chuyển sang một thể hiện bằng cách sử dụng đối chiếu nhị phân hoặc phân biệt chữ hoa chữ thường.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.