2012-07-17 24 views
23

Azure TableStorage RowKeys中是否存在受限字符模式?我無法通過大量搜索找到任何記錄。然而,我得到的行爲暗示着這樣的一些性能測試。我有一些奇怪的行爲,包含隨機字符(測試驅動程序阻止受限制的字符(/ \#?)加上在RowKey中出現阻止單引號)組成的RowKeys。結果是我有一個RowKey將插入到表中,但不能被查詢(結果是InvalidInput)。例如:Azure表存儲RowKey受限字符模式?

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

試圖通過這種RowKwy(平等)查詢會導致錯誤(我們的應用程序,使用Azure存儲資源管理器,雲存儲工作室2中)。我把通過小提琴手正在發送的查看請求:

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中出現的其他字符,但真的想知道「規則」。

回答

41

以下字符中不允許PartitionKey和RowKey字段:

  • 正斜槓(/)字符
  • 反斜槓(\)字符
  • 的數字符號(#)字符
  • 問號(?)字符

請參閱下面的關鍵詞E對於進一步的信息: http://msdn.microsoft.com/en-us/library/windowsazure/dd179338.aspx

+3

還值得注意的是,儘管您可以在RowKey/PartitionKey中擁有%,但在嘗試檢索其關鍵字中包含%的任何行時會遇到問題。 MS知道問題並正在研究解決方案:http://blogs.msdn.com/b/windowsazurestorage/archive/2012/05/28/partitionkey-or-rowkey-containing-the-percent-character-causes-some -windows-azure-tables-apis-to-fail.aspx – knightpfhor 2012-07-17 10:33:31

+0

感謝knightpfhor,那就是我一直在尋找的東西。 – MikeN 2012-07-17 16:03:23

5

我發現,除了在Igorek的回答中列出的字符,這也可能導致問題(例如插入將失敗):

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

與天青Node.js的SDK測試。

+2

這個答案應該用一些說明問題的例子來備份。我已成功地將所有上面列出的字符作爲「RowKey」進行批處理請求。沒有測試過'PartitionKey'不知道是否有區別。限制(如果有的話)可能在Node.js SDK中(或僅適用於較早的Azure存儲API版本)。我發現的唯一沒有記錄的是單引號「''必須在URL中轉義,不使用URI編碼,而是使用兩個連續的單引號'''字符。即''' - >''''。 – 2014-02-09 15:48:20

6

我剛剛發現(困難的方式)'+'符號是允許的,但無法在PartitionKey中查詢。

9

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

創建無效的密鑰的字節數組的哈希,該字節數組轉換爲十六進制字符串,前綴和消毒的表項。

另請參閱相關的MSDN文檔: https://msdn.microsoft.com/en-us/library/azure/dd179338.aspx

相關章節從鏈接: 字符重點領域不允許

下面的字符不值允許的PartitionKey和RowKey屬性:

正斜槓(/)字符

該bac kslash(\)字符

的數字符號(#)字符

問號字符距離U

控制字符+ 0000至U + 001F,包括(?):

  • 水平製表符(\ t)

  • 換行(\ n)字符

  • 回車(\ r)的距離U字符

控制字符+ 007F到U + 009F

注意的是,除了MSDN文章中所提到的字符,我還添加因爲我在一些人們提到它存在問題的地方看到了這種模式的%char。我想這其中的一些還取決於你用來訪問表格存儲的語言和技術。

如果您在您的案例中檢測到其他有問題的字符,那麼您可以將這些字符添加到正則表達式模式中,而不需要更改。

+0

正如Hans Olav所說,值得給你的正則表達式加上「+」號。 我想你在那裏加上%符號的方法是一樣的 - 它允許在關鍵字中使用,但很難查詢以及'+'符號。 我不是100%確定,但似乎所有URL不友好的字符必須編碼查詢... – 2016-09-16 01:34:51

+0

謝謝阿列克謝和漢斯。我將+添加到正則表達式模式。 – 2016-09-19 10:22:14

1

除了上面的內容,您不能在分區鍵的開始處使用下劃線_,也會返回以下劃線開頭的鍵不是有效分區鍵的錯誤。