1

私のデータベースには、珍しい Unicode 文字を英語の文字に変換するための辞書を含む変換テーブルがあります。Unicode 文字がこのテーブルの主キーです。そして、しばらく前に問題に直面しました.T-SQLではいくつかの異なるUnicode文字が同じであり、同時に何にも等しくありません.

それぞれを区別する方法を見つけることができ(「=」は役に立たない)、そのうちの1つをデータベースに挿入することさえできました。しかし、主キーの制約により、すべてが等しいのに複数挿入することはできません。

発見したのは 4 つだけです。しかし、4 は私のシステムを台無しにするのに十分です。

そして、これは彼らがどのように振る舞うかの短いが有益な例です:

DECLARE @Strings TABLE(id int, ucode nvarchar(50))
INSERT INTO @Strings (id, ucode)
    SELECT 1, N'A' UNION -- Usual char
    SELECT 2, N'Ы' UNION -- Some unicode char    
    SELECT 3, N'Ф' UNION -- Another unicode char
    SELECT 5, N' ' UNION -- space
    SELECT 6, N'Ș' UNION -- Unusual unicode char
    SELECT 7, N'Ț' UNION -- Unusual unicode char
    SELECT 8, N'some_string' UNION      -- example string
    SELECT 9, N'some_string ' UNION     -- example string with space
    SELECT 10, N'some_string Ș' UNION   -- example string with unusual char
    SELECT 11, N'some_string Ț'         -- one more

 SELECT * FROM @Strings
 SELECT * FROM @Strings WHERE ucode = N'A'  -- Good one (1 result)
 SELECT * FROM @Strings WHERE ucode = N'Ș'  -- Magic (3 results)
 SELECT * FROM @Strings WHERE ucode = N'Ț'  -- Magic (3 results)
 SELECT * FROM @Strings WHERE ucode = ''    -- Magic (3 results)
 SELECT * FROM @Strings WHERE ucode = 'some_string' -- Magic (4 results)

何か提案はありますか?

4

1 に答える 1

5

=無駄ではありませんが、=比較方法を指定する必要があります。デフォルトはデータベース レベルで設定され、列は異なる比較規則を指定しないため、列はデータベースの比較規則を取得します。主キーは と同じ比較規則を使用する=ため、一方を修正すると、もう一方も意図したとおりに機能します。

比較規則の指定は、COLLATEキーワードで行われます。すべてのコード ポイントを個別の文字として扱う必要がある 1 つの照合順序は ですLatin1_General_BIN2

DECLARE @Strings TABLE(id int, ucode nvarchar(50) COLLATE Latin1_General_BIN2)
于 2013-01-08T17:33:17.580 に答える