Sql-Server

強制使用不同數量的尾隨空格

  • March 7, 2019

我正在將基於 SQL Anywhere (ASA) 5.5 的應用程序及其數據庫轉換為 Microsoft SQL Server。

Existing 是一個主鍵聚集在兩列上的表,code_type char(4)並且code char(30). 我能夠很好地建構表格,但是嘗試移動數據時遇到了衝突,因為表格包含 (‘cha’, ‘’) 和 (‘cha’, ‘’) 並且與另一個開發人員交談聽起來像這有一個案例。不是真的想重新培訓使用者,有什麼選項可以在數據庫級別強制執行不同數量的空間?

該數據庫用於單個應用程序,因此最終我可以依靠控制數據如何插入表中,但希望在表定義中強制執行預期的區別。

如果 (‘cha’, ‘’) 存在於表中,我希望能夠插入 (‘cha’, ’ ‘) 因為它有更多的尾隨空格,但不是 (‘cha’, ‘’) 因為它具有與現有條目相同數量的空格 (0)。

這個關於 UNIQUE Index的問題概述了唯一索引的行為,SQL 在根據 ANSI/ISO SQL-92 第 8.2 節一般規則 #3 進行比較之前,應用正確的空格填充以使兩個字元串大小相等。我已經使用char作為連結的類型確認了這種行為varchar。我不承諾使用密鑰,只是以某種方式強制執行不同數量的尾隨空格。

有相當多的字元保證不會出現在第二列中。該欄位是字母縮寫或法律文件引用。法律文件引用似乎包含字母數字字元加上’(’、’)’、’-’、’.’、‘‘和’/’。

我不會稱這是一個好的解決方案,但它似乎有效。您可以創建帶有附加字元的計算列,code_type並在計算列上創建唯一索引。對於附加的字元,如果您想避免做出這樣的假設,您可以使用永遠不會出現在您的數據中的字元或任何長度至少為 31 個字元的字元串。通過一個例子可能是最容易的。

這是您遇到的問題:

CREATE TABLE dbo.T226714 (
   code_type CHAR(4) NOT NULL,
   code VARCHAR(30) NOT NULL,
   PRIMARY KEY (code_type, code)
);

-- fails due to PK error
INSERT INTO dbo.T226714 VALUES ('cha', ' ');
INSERT INTO dbo.T226714 VALUES ('cha', '');

相反,請執行以下操作:

DROP TABLE dbo.T226714;

CREATE TABLE dbo.T226714 (
   code_type CHAR(4) NOT NULL,
   code VARCHAR(30) NOT NULL,
   code_with_end_char AS CAST(code + 'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ' AS VARCHAR(61))
);

CREATE UNIQUE INDEX UI ON dbo.T226714 (code_type, code_with_end_char);

-- works
INSERT INTO dbo.T226714 VALUES ('cha', ' ');
INSERT INTO dbo.T226714 VALUES ('cha', '');

-- can't insert this as a third row due to the unique index:
INSERT INTO dbo.T226714 VALUES ('cha', ' ');

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