web-dev-qa-db-fra.com

Azure Table Storage RowKey restreint les modèles de caractères?

Existe-t-il des modèles de caractères restreints dans Azure TableStorage RowKeys? Je n'ai pas pu trouver de documentation documentée via de nombreuses recherches. Cependant, j'obtiens un comportement qui implique de tels tests de performance.

J'ai un comportement étrange avec RowKeys consistant en des caractères aléatoires (le pilote de test empêche les caractères restreints (/\#?) Plus le blocage de guillemets simples dans RowKey). Le résultat est que j'ai une RowKey qui s'insérera bien dans la table, mais ne peut pas être interrogée (le résultat est InvalidInput). Par exemple:

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

Si vous tentez d'interroger par ce RowKwy (égalité), une erreur se produira (à la fois dans notre application, à l'aide d'Azure Storage Explorer et de Cloud Storage Studio 2). J'ai jeté un coup d'œil à la demande envoyée par Fiddler:

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

Il semble que le% 54 dans la RowKey ne soit pas échappé dans le filtre. Il est intéressant de noter que le comportement des demandes de traitement par lots dans le stockage de table est similaire à celui des URI du XML de traitement par lots qui incluent cette clé de clé. J'ai également constaté un comportement similaire pour RowKeys avec des guillemets doubles incorporés, même si je n'ai pas encore isolé ce modèle.

Est-ce que quelqu'un m'a traversé ce comportement? Je peux facilement empêcher d'autres caractères d'apparaître dans RowKeys, mais j'aimerais vraiment connaître les «règles».

26
MikeN

Les caractères suivants ne sont pas autorisés dans les champs PartitionKey et RowKey:

  • La barre oblique (/)
  • La barre oblique inverse (\)
  • Le signe dièse (#) 
  • Le point d'interrogation (?) Caractère

Veuillez vous reporter à l'article suivant pour plus d'informations: http://msdn.Microsoft.com/en-us/library/windowsazure/dd179338.aspx

46
Igorek

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

Détection des clés de partition et de ligne de table non valides: 

bool invalidKey = DisallowedCharsInTableKeys.IsMatch(tableKey);

Désinfection de la partition ou de la clé de ligne non valide: 

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

À ce stade, vous pouvez également préfixer la clé nettoyée (clé de partition ou clé de ligne) avec le hachage de la clé d'origine pour éviter les collisions fausses de différentes clés non valides ayant la même valeur filtrée.

N'utilisez pas string.GetHashCode () car il peut produire un code de hachage différent pour la même chaîne et ne doit pas être utilisé pour identifier l'unicité et ne doit pas être conservé.

J'utilise SHA256: https://msdn.Microsoft.com/en-us/library/s02tk69a(v=vs.110).aspx

pour créer le hachage du tableau d'octets de la clé non valide, convertissez-le en chaîne hexadécimale et préfixez-le avec la clé de table assainie.

Voir également la documentation MSDN associée: https://msdn.Microsoft.com/en-us/library/Azure/dd179338.aspx

Section connexe du lien: Caractères non autorisés dans les champs de clé

Les caractères suivants ne sont pas autorisés dans les valeurs des propriétés PartitionKey et RowKey:

La barre oblique (/)

La barre oblique inverse (\)

Le signe dièse (#)

Le point d'interrogation (?) Caractère

Caractères de contrôle de U + 0000 à U + 001F, y compris:

  • Le caractère de tabulation horizontale (\ t)

  • Le caractère de saut de ligne (\ n)

  • Le caractère de retour chariot (\ r)

Caractères de contrôle de U + 007F à U + 009F 

Notez qu’outre les caractères mentionnés dans l’article MSDN, j’ai également ajouté le caractère% au motif depuis que j’ai vu à quelques endroits où les gens le mentionnent comme étant problématique. Je suppose que cela dépend aussi du langage et de la technologie que vous utilisez pour accéder au stockage de la table.

Si vous détectez des caractères problématiques supplémentaires dans votre cas, vous pouvez les ajouter au motif regex, rien d'autre ne doit changer.

12
Dogu Arslan

Je viens de découvrir (à la dure) que le signe '+' est autorisé, mais impossible d'interroger dans PartitionKey.

6
Hans Olav

J'ai trouvé qu'en plus des caractères énumérés dans la réponse d'Igorek, ceux-ci peuvent également causer des problèmes (par exemple, l'insertion échouera):

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

Testé avec le SDK Azure Node.js.

5
laktak

En plus de ce qui précède, vous ne pouvez pas non plus utiliser un trait de soulignement _ au début d'une clé de partition. Une erreur est renvoyée: une clé commençant par un trait de soulignement n'est pas une clé de partition valide.

1
Remi