sql >> データベース >  >> RDS >> Sqlserver

Unicodeから非Unicodeへの変換

    ここで注意すべき点がいくつかあります:

    1. そこにある文字を正確に確認したい場合は、値をVARBINARYに変換できます。 これにより、文字列内のすべての文字の16進数/ 2進数値が得られ、16進数に「非表示」文字の概念はありません:

      DECLARE @PostalCode NVARCHAR(20);
      SET @PostalCode = N'053000'+ NCHAR(0x2008); -- 0x2008 = "Punctuation Space"
      SELECT @PostalCode AS [NVarCharValue],
             CONVERT(VARCHAR(20), @PostalCode) AS [VarCharValue],
             CONVERT(VARCHAR(20), RTRIM(@PostalCode)) AS [RTrimmedVarCharValue],
             CONVERT(VARBINARY(20), @PostalCode) AS [VarBinaryValue];
      

      返品:

      NVarCharValue   VarCharValue   RTrimmedVarCharValue   VarBinaryValue
      053000          053000?        053000?                0x3000350033003000300030000820
      

      NVARCHAR データは、2バイトセットで動作するUTF-16として保存されます。最後の4桁の16進数を見て、非表示の2バイトセットが何であるかを確認すると、「0820」が表示されます。 WindowsとSQLServerはUTF-16リトルエンディアン(つまりUTF-16LE)であるため、バイトは逆の順序になります。最後の2バイトを反転する-08 および20 --NCHAR(0x2008)を介して追加した「句読点」である「2008」を取得します。 。

      また、RTRIMにも注意してください ここではまったく役に立ちませんでした。

    2. 簡単に言うと、疑問符を何も置き換えないでください:

      SELECT REPLACE(CONVERT(VARCHAR(20), [PostalCode]), '?', '');
      
    3. さらに重要なのは、[PostalCode]を変換する必要があることです。 VARCHARへのフィールド これらの文字を保存しないようにします。少なくとも私がこれまで読んだ限りでは、ASCII文字セットで表されておらず、VARCHARデータ型に対して無効な文字を使用している国はありません(参照については下のセクションを参照してください)。実際、許可されているのはASCIIのかなり小さなサブセットです。つまり、途中で簡単にフィルタリングできます(または同じREPLACEを実行できます)。 上記のように挿入または更新する場合):

      ALTER TABLE [table] ALTER COLUMN [PostalCode] VARCHAR(20) [NOT]? NULL;
      

      現在のNULLを必ず確認してください / NOT NULL 列の設定を行い、上記のALTERステートメントで同じにします。そうでない場合は、デフォルトがNULLであるため変更できます。 指定されていない場合。

    4. テーブルのスキーマを変更できず、不良データの定期的な「クレンジング」を実行する必要がある場合は、次のコマンドを実行できます。

      ;WITH cte AS
      (
         SELECT *
         FROM   TableName
         WHERE  [PostalCode] <>
                        CONVERT(NVARCHAR(50), CONVERT(VARCHAR(50), [PostalCode]))
      )
      UPDATE cte
      SET    cte.[PostalCode] = REPLACE(CONVERT(VARCHAR(50), [PostalCode]), '?', '');
      

      テーブルに数百万行ある場合、上記のクエリは効率的に機能することを意図していないことに注意してください。その時点で、ループを介して小さなセットで処理する必要があります。

    参考までに、<​​a rel="nofollow noreferrer noopener"href="https://en.wikipedia.org/wiki/Postal_code#Character_sets">郵便番号 のウィキペディアの記事をご覧ください。 、現在、これまでに使用された文字は次のとおりです。

    フィールドの最大サイズについては、ウィキペディアの郵便番号のリスト をご覧ください。



    1. SELECTクエリでのSQLServerLOCKSについて

    2. トランザクションの影響を受けないシーケンス?

    3. 一意でない場合のMySQLUUID()?

    4. SQLの逆LIKE'%value%'