2012-07-17 11 views
23

Esistono modelli di caratteri limitati in Azure TableStorage RowKeys? Non sono stato in grado di trovare alcun documento tramite numerose ricerche. Tuttavia, sto ricevendo un comportamento che implica un tale controllo delle prestazioni.Archiviazione tabella di Azure RowKey Pattern di caratteri con restrizioni?

Ho un comportamento strano con RowKeys costituito da caratteri casuali (il test driver impedisce i caratteri con restrizioni (/ \ #?) Oltre a bloccare le virgolette singole che si verificano nel RowKey). Il risultato è che ho un RowKey che inserirà fine nella tabella, ma non può essere interrogato (il risultato è InvalidInput). Per esempio:

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

Il tentativo di interrogare da questa RowKwy (uguaglianza) si tradurrà in un errore (sia all'interno della nostra app, utilizzando Azure Storage Explorer, e Cloud Storage Studio 2). Ho dato un'occhiata a richiesta viene inviata tramite Fiddler:

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

Sembra che il 54% nel RowKey non è sfuggito nel filtro. È interessante notare che ottengo un comportamento simile per le richieste batch allo storage della tabella con URI nel file XML XML che include questo RowKey. Ho anche visto un comportamento simile per RowKeys con doppie virgolette incorporate, sebbene non abbia ancora isolato quel modello.

Qualcuno mi ha parlato di questo comportamento? Posso facilmente limitare i caratteri aggiuntivi che si verificano in RowKeys, ma mi piacerebbe davvero conoscere le 'regole'.

risposta

41

I seguenti caratteri non sono ammessi nei campi PartitionKey e RowKey:

  • Il carattere barra (/)
  • La barra rovesciata (\) personaggio
  • Il simbolo di cancelletto (#) personaggio
  • Il punto interrogativo (?) Carattere

Fare riferimento al seguente articolo e per ulteriori informazioni: http://msdn.microsoft.com/en-us/library/windowsazure/dd179338.aspx

+3

Vale anche la pena notare che mentre si può avere una% in un RowKey/PartitionKey si avranno problemi nel tentativo di recuperare qualsiasi riga che abbia una% nella sua chiave. Gli Stati membri sono a conoscenza del problema e cercano soluzioni: http://blogs.msdn.com/b/windowsazurestorage/archive/2012/05/28/partitionkey-or-rowkey-contain-the-percent-character-causes-some -windows-azure-tables-apis-to-fail.aspx – knightpfhor

+0

Grazie a knightpfhor, questo è quello che stavo cercando. – MikeN

5

Ho scoperto che oltre ai caratteri elencati nella risposta di Igorek, anche questi possono causare problemi (ad es. inserimenti falliranno):

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

Testato con Azure SDK Node.js.

+2

Questa risposta dovrebbe essere sottoposta a backup con alcuni esempi che illustrano il problema. Sono riuscito a fare richieste batch con tutti i caratteri sopra elencati come un 'RowKey'. Non abbiamo testato 'PartitionKey' non so se c'è una differenza. La limitazione, se presente, è probabilmente nell'SDK Node.js (o applicabile solo a una versione precedente di Azure Storage API). L'unica cosa che ho trovato che non è stata documentata è che la virgoletta singola ''' deve essere sfuggita negli URL, non usando la codifica URI ma usando due caratteri consecutivi' ''. Ad esempio '' -> ''''. –

6

Ho appena scoperto (nel modo più rigido) che è consentito il segno "+", ma non è possibile eseguire una query in PartitionKey.

9

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

rilevamento della tabella non valido partizioni e tasti Row:

bool invalidKey = DisallowedCharsInTableKeys.IsMatch(tableKey);

Sanificazione la partizione non valido o la riga di chiave:

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

In questa fase si può anche vuoi anteporre il tasto igienizzato (Partition Key o Row Key) con l'hash della chiave originale per evitare false collisioni di diverse chiavi non valide aventi lo stesso valore igienizzato.

Non utilizzare la stringa.GetHashCode() sebbene possa produrre codice hash diverso per la stessa stringa e non deve essere utilizzato per identificare l'unicità e non deve essere persistuto.

Io uso SHA256: https://msdn.microsoft.com/en-us/library/s02tk69a(v=vs.110).aspx

per creare l'hash array di byte della chiave non valida, convertire l'array di byte a stringa esadecimale ed il prefisso del tasto tavolo igienizzata con quello.

anche vedere relativi MSDN Documentazione: https://msdn.microsoft.com/en-us/library/azure/dd179338.aspx

sezione relativa dal link: caratteri non consentiti nei campi chiave

I seguenti caratteri non sono ammessi nei valori delle proprietà PartitionKey e RowKey:

Il carattere barra in avanti (/)

Il bac kslash (\) personaggio

Il simbolo di cancelletto (#) personaggio

Il punto interrogativo carattere

caratteri di controllo da U + 0000 a U + 001F, tra cui (?):

  • La scheda orizzontale (\ t) carattere

  • L'avanzamento riga (\ n)

  • Il ritorno (\ r) carattere

caratteri Control U + 007F a U + 009F

noti che oltre ai caratteri menzionati nell'articolo MSDN, ho anche aggiunto il% char per il pattern da quando ho visto in alcuni posti dove la gente dice che è problematico. Immagino che parte di questo dipenda anche dalla lingua e dalla tecnologia che stai utilizzando per accedere alla memoria della tabella.

Se si rilevano altri caratteri problematici nel proprio caso, è possibile aggiungerli al modello regex, non è necessario modificare nient'altro.

+0

vale la pena di aggiungere il segno "+" alla tua regex come menzionato da Hans Olav. Penso che tu abbia aggiunto% sign lì con lo stesso ragionamento: è permesso nella chiave, ma è difficile interrogare oltre al segno '+'. Non sono sicuro al 100% ma sembra che tutti gli URL di caratteri ostili devono essere codificati per l'interrogazione ... –

+0

Grazie Alex e Hans. Ho aggiunto il + al modello regex. –

1

In aggiunta a quanto sopra non è possibile utilizzare un trattino di sottolineatura _ all'inizio di una chiave di partizione, viene restituito un errore che una chiave che inizia con un trattino basso non è una chiave di partizione valida.

Problemi correlati