38

Azure TableStorage の RowKeys 内に制限された文字パターンはありますか? 多数の検索で文書化されたものを見つけることができませんでした。ただし、一部のパフォーマンス テストでは、そのような動作が発生しています。

ランダムな文字で構成される RowKey で奇妙な動作が発生しました (テスト ドライバーは、制限された文字 (/ \ # ?) を防止し、RowKey で単一引用符が発生するのをブロックします)。結果は、テーブルに正常に挿入される RowKey を取得しましたが、クエリを実行できません (結果は InvalidInput です)。例えば:

RowKey: 9}5O0J=5Z,4,D,{!IKPE,~M]%54+9G0ZQ&G34!G+

この RowKwy (等しい) でクエリを実行しようとすると、エラーが発生します (アプリ内で、Azure Storage Explorer を使用して、Cloud Storage Studio 2 の両方で)。Fiddler 経由で送信されるリクエストを確認しました。

GET /foo()?$filter=RowKey%20eq%20'9%7D5O0J=5Z,4,D,%7B!IKPE,~M%5D%54+9G0ZQ&G34!G+' HTTP/1.1

RowKey の %54 がフィルターでエスケープされていないようです。興味深いことに、この RowKey を含むバッチ XML 内の URI を使用したテーブル ストレージへのバッチ リクエストでも同様の動作が得られます。二重引用符が埋め込まれた RowKeys についても同様の動作を見てきましたが、そのパターンはまだ分離していません。

この振る舞いに遭遇した人はいますか?RowKeys で追加の文字が発生しないように簡単に制限できますが、「ルール」を知りたいです。

4

5 に答える 5

60

次の文字は、PartitionKeyおよびRowKeyフィールドでは使用できません。

  • スラッシュ(/)文字
  • バックスラッシュ(\)文字
  • 番号記号(#)文字
  • 疑問符(?)文字

参考資料:AzureDocs >テーブルサービスデータモデルを理解する

于 2012-07-17T02:47:50.977 に答える
28

public static readonly Regex DisallowedCharsInTableKeys = new Regex(@"[\\\\#%+/?\u0000-\u001F\u007F-\u009F]");

無効なテーブル パーティションと行キーの検出:

bool invalidKey = DisallowedCharsInTableKeys.IsMatch(tableKey);

無効なパーティションまたは行キーのサニタイズ:

string sanitizedKey = DisallowedCharsInTableKeys.Replace(tableKey, disallowedCharReplacement);

この段階で、サニタイズされたキー (パーティション キーまたは行キー) の前に元のキーのハッシュを付けて、サニタイズされた同じ値を持つ異なる無効なキーの誤った衝突を回避することもできます。

ただし、string.GetHashCode() は使用しないでください。これは、同じ文字列に対して異なるハッシュ コードが生成される可能性があり、一意性の識別には使用されず、永続化されないためです。

SHA256 を使用します: https://msdn.microsoft.com/en-us/library/s02tk69a(v=vs.110).aspx

無効なキーのバイト配列ハッシュを作成するには、バイト配列を 16 進文字列に変換し、サニタイズされたテーブル キーの前にそれを付けます。

関連する MSDN ドキュメントも参照してください: https://msdn.microsoft.com/en-us/library/azure/dd179338.aspx

リンクからの関連セクション: Character Disallowed in Key Fields

次の文字は、PartitionKey および RowKey プロパティの値には使用できません。

スラッシュ (/) 文字

バックスラッシュ (\) 文字

番号記号 (#) 文字

疑問符 (?) 文字

U+0000 から U+001F までの制御文字:

  • 水平タブ (\t) 文字

  • 改行 (\n) 文字

  • キャリッジ リターン (\r) 文字

U+007F から U+009F までの制御文字

MSDN の記事で言及されている文字に加えて、パターンに % 文字も追加したことに注意してください。これは、問題があると人々が言及している場所がいくつか見られたためです。これの一部は、テーブルストレージへのアクセスに使用している言語と技術にも依存していると思います.

ケースで問題のある追加の文字を検出した場合は、それらを正規表現パターンに追加できます。他に変更する必要はありません。

于 2016-06-10T13:30:23.173 に答える
10

「+」記号は許可されているが、PartitionKey でクエリを実行できないことがわかりました (難しい方法です)。

于 2014-12-12T09:18:36.697 に答える