web-dev-qa-db-ja.com

Azure Table Storage RowKeyは文字パターンを制限していますか?

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

ランダムな文字で構成されるRowKeysでいくつかの奇妙な動作があります(テストドライバーは制限された文字(/ \#?)に加えて、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で追加の文字が発生するのを簡単に制限できますが、本当に「ルール」を知りたいです。

31
MikeN

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

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

詳細については、次の記事を参照してください。 http://msdn.Microsoft.com/en-us/library/windowsazure/dd179338.aspx

50
Igorek

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

リンクの関連セクション:キーフィールドで使用できない文字

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

スラッシュ(/)文字

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

番号記号(#)文字

疑問符(?)文字

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

  • 水平タブ(\ t)文字

  • 改行(\ n)文字

  • 復帰(\ r)文字

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

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

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

15
Dogu Arslan

Igorekの回答に記載されている文字に加えて、これらも問題を引き起こす可能性があることがわかりました(たとえば、挿入が失敗します)。

  • |
  • []
  • {}
  • <>
  • $ ^&

Azure Node.js SDKでテスト済み。

6
laktak

'+'記号が許可されていることを(難しい方法で)見つけましたが、PartitionKeyでクエリを実行することはできません。

6
Hans Olav

上記に加えて、パーティションキーの先頭にアンダースコア_を使用することもできません。アンダースコアで始まるキーが有効なパーティションキーではないというエラーが返されます。

1
Remi