Sql-Server

刪除 char(185) 時替換刪除 Ones / 1 的函式(上標 1)

  • October 9, 2019

好的,正如標題所暗示的那樣。

REPLACE對臨時表中的數據使用 char(185) 上的函式時,也會刪除那些(“1”)。

SQL SERVER 2008R2

UNICODE 數據

數據庫排序 - 排序 SQL_Latin1_General_CP1_CS_AS Tempdb 具有預設值

我可以提供的任何其他可能有用的細節,請告訴我。

CHAR(185),作為 VARCHAR 數據,使用 8 位程式碼頁,可以是不同的字元,具體取決於所使用的程式碼頁(由使用CHAR()函式時目前數據庫的排序規則決定)。在許多程式碼頁中,包括常見的 Windows-1252 (Latin1_General),字元是上標 1(即“ 1 ”)。根據所使用的排序規則/程式碼頁,此字元可能具有到正常“1”的“最合適”映射。

此外,在使用 Windows 排序規則時,區分大小寫會影響相同字元的下標、上標和正常版本之間的匹配結果(說真的!請參見下面的範例)。這也涵蓋了NVARCHAR/Unicode 數據(包括VARCHAR從 SQL Server 2019 開始的 UTF-8)。

當需要匹配特定字元時,您需要使用二進制排序規則(即以_BIN2除非在 SQL Server 2005 或更早版本上結束,在這種情況下只有_BIN排序規則可用)。

SELECT CHAR(185)
WHERE  CHAR(185) = '1' COLLATE SQL_Latin1_General_CP1_CI_AS
-- no rows (SQL Server collation, code page 1252, case insensitive)



SELECT CHAR(185)
WHERE  CHAR(185) = '1' COLLATE SQL_Latin1_General_CP437_CI_AS
-- 1 row (SQL Server collation, code page 437, case insensitive)

SELECT CHAR(185)
WHERE  CHAR(185) = '1' COLLATE SQL_Latin1_General_CP437_CS_AS
-- 1 row (SQL Server collation, code page 437, case sensitive)



SELECT CHAR(185)
WHERE  CHAR(185) = '1' COLLATE Latin1_General_100_CI_AS
-- 1 row (Windows collation, code page 1252, case insensitive)

SELECT CHAR(185)
WHERE  CHAR(185) = '1' COLLATE Latin1_General_100_CS_AS
-- no rows (Windows collation, code page 1252, case sensitive)



SELECT CHAR(185)
WHERE  CHAR(185) = '1' COLLATE Latin1_General_100_BIN2;
-- no rows (Windows collation, code page 1252, _BIN2 collation; always works!)

如上所述,Unicode 數據(不管排序規則的類型)VARCHAR與 Windows 排序規則使用的數據相同(因為兩種情況都使用相同的 Unicode 規則):

SELECT NCHAR(185)
WHERE  NCHAR(185) = N'1' COLLATE Latin1_General_100_CI_AS
-- 1 row (Windows collation, Unicode data, case insensitive)

SELECT NCHAR(185)
WHERE  NCHAR(185) = N'1' COLLATE Latin1_General_100_CS_AS
-- no rows (Windows collation, Unicode data, case sensitive)

引用自:https://dba.stackexchange.com/questions/250586