ここで注意すべき点がいくつかあります:
-
そこにある文字を正確に確認したい場合は、値を
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
にも注意してください ここではまったく役に立ちませんでした。 -
簡単に言うと、疑問符を何も置き換えないでください:
SELECT REPLACE(CONVERT(VARCHAR(20), [PostalCode]), '?', '');
-
さらに重要なのは、
[PostalCode]
を変換する必要があることです。VARCHAR
へのフィールド これらの文字を保存しないようにします。少なくとも私がこれまで読んだ限りでは、ASCII文字セットで表されておらず、VARCHARデータ型に対して無効な文字を使用している国はありません(参照については下のセクションを参照してください)。実際、許可されているのはASCIIのかなり小さなサブセットです。つまり、途中で簡単にフィルタリングできます(または同じREPLACE
を実行できます)。 上記のように挿入または更新する場合):ALTER TABLE [table] ALTER COLUMN [PostalCode] VARCHAR(20) [NOT]? NULL;
現在の
NULL
を必ず確認してください /NOT NULL
列の設定を行い、上記のALTERステートメントで同じにします。そうでない場合は、デフォルトがNULL
であるため変更できます。 指定されていない場合。 -
テーブルのスキーマを変更できず、不良データの定期的な「クレンジング」を実行する必要がある場合は、次のコマンドを実行できます。
;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">郵便番号 のウィキペディアの記事をご覧ください。 、現在、これまでに使用された文字は次のとおりです。
フィールドの最大サイズについては、ウィキペディアの郵便番号のリスト をご覧ください。