Azure表存储RowKey限制字符模式?

Mik*_*keN 31 azure azure-table-storage

Azure TableStorage RowKeys中是否存在受限制的字符模式?我无法通过大量搜索找到任何记录.但是,我在一些性能测试中得到了这样的行为.

我有一些奇怪的行为,RowKeys包含随机字符(测试驱动程序确实阻止了受限字符(/ \#?)并阻止在RowKey中发生单引号).结果是我有一个RowKey,可以很好地插入到表中,但无法查询(结果是InvalidInput).例如:

RowKey: 9}5O0J=5Z,4,D,{!IKPE,~M]%54+9G0ZQ&G34!G+
Run Code Online (Sandbox Code Playgroud)

尝试通过此RowKwy(相等)进行查询将导致错误(在我们的应用程序中,使用Azure存储资源管理器和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
Run Code Online (Sandbox Code Playgroud)

看起来RowKey中的%54未在过滤器中转义.有趣的是,对于包含此RowKey的批处理XML中包含URI的表存储的批处理请求,我得到了类似的行为.我也看到RowKeys使用嵌入式双引号的类似行为,但我尚未分离出该模式.

有没有人陪我这个行为?我可以很容易地限制RowKeys中出现的其他字符,但是我们真的想知道"规则".

Igo*_*rek 50

PartitionKey和RowKey字段中不允许使用以下字符:

  • 正斜杠(/)字符
  • 反斜杠(\)字符
  • 数字符号(#)字符
  • 问号(?)字符

有关详细信息,请参阅以下文章:http: //msdn.microsoft.com/en-us/library/windowsazure/dd179338.aspx

  • 还值得注意的是,虽然你可以在RowKey/PartitionKey中拥有%,但是在尝试检索其键中包含%的任何行时会遇到问题.MS了解这个问题并寻找解决方案:http://blogs.msdn.com/b/windowsazurestorage/archive/2012/05/28/partitionkey-or-rowkey-containing-the-percent-character-causes-some -Windows-蔚表的API对fail.aspx (3认同)

Dog*_*lan 15

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属性的值中不允许使用以下字符:

正斜杠(/)字符

反斜杠(\)字符

数字符号(#)字符

问号(?)字符

控制字符从U + 0000到U + 001F,包括:

  • 水平制表符(\ t)字符

  • 换行符(\n)字符

  • 回车(\ r)字符

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

请注意,除了MSDN文章中提到的字符之外,我还在模式中添加了%char,因为我在一些人们提到它有问题的地方看到了.我想其中一些还取决于您用来访问表存储的语言和技术.

如果您在案例中检测到其他有问题的字符,那么您可以将它们添加到正则表达式模式中,其他任何内容都不需要更改.


小智 7

我刚刚发现(艰难的方式)允许'+'符号,但不能在PartitionKey中查询.


lak*_*tak 6

我发现除了Igorek的答案中列出的字符外,这些也会引起问题(例如插入会失败):

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

使用Azure Node.js SDK进行测试.

  • 应该通过一些说明问题的示例来回答这个答案.我已成功地将所有上面列出的字符作为"RowKey"进行批量请求.没有测试`PartitionKey`不知道是否有区别.限制(如果有)可能在Node.js SDK中(或仅适用于较旧的Azure Storage API版本).我发现的唯一没有记录的是单引号`'`必须在URL中转义,不使用URI编码,而是使用两个连续的单引号`''字符.即`'` - >`''`. (2认同)