0

LINQ to Entities を使用して、SQL サーバーに保存された文字列内の問題のある文字を識別できるようにしたいと考えています。

問題のある文字は、エンコード処理で問題があった文字です。

これは問題のある文字列の例です: "testing�stringáאç".

上記の例では、� 文字のみが問題と見なされます。

したがって、たとえば次の文字列は問題とは見なされません:"testingstringáאç". この Varchar をチェックして、問題のある文字が含まれていることを特定するにはどうすればよいですか?

私の推奨する解決策は、LINQ to entities query を介してそれを識別することですが、他の解決策も歓迎されます-たとえば、ストアプロシージャでしょうか?

正規表現と「LIKE」ステートメントで遊んでみましたが、成功しませんでした...

4

3 に答える 3

2

Encoding クラスを確認してください。

DecoderFallback プロパティと EncoderFallback プロパティがあり、デコード中に見つかった不良文字を検出して置換できます。

于 2013-03-02T15:45:44.583 に答える
1

.NetとNVARCHARはどちらもUnicodeを使用しているため、本質的に「問題のある」ものはありません(少なくともBMP文字の場合はそうではありません)。

したがって、最初に「問題のある」とはどういう意味かを定義する必要があります。

  • 文字はターゲットコードページにマップされていません

エンコーディング間で変換し、データが失われていないかどうかを確認するだけです。

CONVERT(NVARCHAR, CONVERT(VARCHAR, @originalNVarchar)) = @originalNVarchar

デフォルトのデータベース照合を使用するのではなく、COLLATE句を使用してSQLServer照合を使用できることに注意してください。

  • 使用しているフォントが原因で文字を表示できません

これは.Netでは簡単に行うことはできません

于 2013-03-02T15:59:39.977 に答える
1

次のようなことができます。

DECLARE @StringWithProblem NVARCHAR(20) = N'This is '+NCHAR(8)+N'roblematic';
DECLARE @ProblemChars NVARCHAR(4000) = N'%['+NCHAR(0)+NCHAR(1)+NCHAR(8)+']%'; --list all problematic characters here, wrapped in %[]%

SELECT PATINDEX(@ProblemChars, @StringWithProblem), @StringWithProblem;

これにより、最初の問題のある文字のインデックスが得られます。何も見つからない場合は 0 になります。

于 2013-03-02T15:46:23.857 に答える