2012-07-17 29 views
23

Có các mẫu ký tự bị hạn chế trong Azure RowStorage RowKeys không? Tôi đã không thể tìm thấy bất kỳ tài liệu nào thông qua nhiều tìm kiếm. Tuy nhiên, tôi nhận được hành vi ngụ ý như vậy trong một số thử nghiệm hiệu suất.Azure Bảng lưu trữ RowKey hạn chế các mẫu ký tự?

Tôi có một số hành vi kỳ lạ với RowKeys bao gồm các ký tự ngẫu nhiên (trình điều khiển thử nghiệm ngăn chặn các ký tự bị giới hạn (/ \ #?) Cộng với việc chặn các dấu nháy đơn xuất hiện trong RowKey). Kết quả là tôi đã có một RowKey mà sẽ chèn tốt vào bảng, nhưng không thể được truy vấn (kết quả là InvalidInput). Ví dụ:

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

Cố gắng truy vấn bởi RowKwy này (bình đẳng) sẽ dẫn đến lỗi (trong ứng dụng của chúng tôi, sử dụng Azure Storage Explorer và Cloud Storage Studio 2). Tôi đã xem xét yêu cầu được gửi qua Fiddler:

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

Dường như% 54 trong RowKey không được thoát trong bộ lọc. Thật thú vị, tôi nhận được hành vi tương tự cho các yêu cầu hàng loạt để lưu trữ bảng với URI trong lô XML bao gồm RowKey này. Tôi cũng đã nhìn thấy hành vi tương tự cho RowKeys với các dấu ngoặc kép được nhúng, mặc dù tôi chưa cô lập mô hình đó.

Có ai đồng ý với tôi về hành vi này không? Tôi có thể dễ dàng hạn chế các ký tự khác xuất hiện trong RowKeys, nhưng thực sự muốn biết 'quy tắc'.

Trả lời

41

Các nhân vật sau đây không được phép vào PartitionKey và RowKey lĩnh vực:

  • Các dấu gạch chéo (/) nhân vật
  • Các dấu chéo ngược (\) nhân vật
  • Dấu hiệu số (#) nhân vật
  • Ký hiệu dấu hỏi (?)

Vui lòng tham khảo articl sau e để biết thêm thông tin: http://msdn.microsoft.com/en-us/library/windowsazure/dd179338.aspx

+3

Cũng đáng lưu ý rằng trong khi bạn có thể có% trong một RowKey/PartitionKey, bạn sẽ gặp sự cố khi cố gắng truy xuất bất kỳ hàng nào có% trong khóa của nó. MS nhận thức được vấn đề và xem xét các giải pháp: 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

+0

Cảm ơn knightpfhor, đó là những gì tôi đang tìm kiếm. – MikeN

5

Tôi thấy rằng ngoài các ký tự được liệt kê trong câu trả lời của Igorek, chúng cũng có thể gây ra sự cố (ví dụ: chèn sẽ thất bại):

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

Tested với Azure Node.js SDK.

+2

Câu trả lời này nên được sao lưu với một số ví dụ minh họa vấn đề. Tôi đã có thể thực hiện thành công các yêu cầu hàng loạt với tất cả các ký tự được liệt kê ở trên là một 'RowKey'. Chưa kiểm tra 'PartitionKey' không biết nếu có sự khác biệt. Giới hạn, nếu có, có thể là trong SDK Node.js (hoặc chỉ áp dụng cho phiên bản API lưu trữ Azure cũ hơn). Điều duy nhất tôi thấy không được ghi lại là dấu nháy đơn ''' phải được thoát trong URL, không sử dụng mã hóa URI mà chỉ sử dụng hai ký tự '' 'đơn liên tiếp. tức là ''' -> '' ''. –

6

Tôi vừa phát hiện ra (một cách khó khăn) rằng dấu '+' được cho phép, nhưng không thể truy vấn trong PartitionKey.

9

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

Detection của Bảng phân vùng không hợp lệ và Row Keys:

bool invalidKey = DisallowedCharsInTableKeys.IsMatch(tableKey);

Vệ sinh các phân vùng không hợp lệ hoặc Row chính:

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

Ở giai đoạn này, bạn cũng có thể muốn tiền tố khóa được khử trùng (Khóa phân vùng hoặc Khóa hàng) với mã băm của khóa gốc để tránh va chạm sai của các khóa không hợp lệ khác nhau có cùng giá trị được khử trùng.

Không sử dụng chuỗi.GetHashCode() mặc dù vì nó có thể tạo mã băm khác nhau cho cùng một chuỗi và không được sử dụng để xác định tính duy nhất và không được duy trì.

tôi sử dụng SHA256: https://msdn.microsoft.com/en-us/library/s02tk69a(v=vs.110).aspx

để tạo ra băm mảng byte của khóa không hợp lệ, chuyển đổi mảng byte thành chuỗi hex và tiền tố then chốt bảng vệ sinh với điều đó.

Xem thêm liên quan MSDN Tài liệu: https://msdn.microsoft.com/en-us/library/azure/dd179338.aspx

Mục liên quan từ liên kết: Nhân vật Disallowed ở Key Fields

Các nhân vật sau đây không được phép vào các giá trị cho các thuộc tính PartitionKey và RowKey:

Ký tự gạch chéo về phía trước (/)

Bac kslash (\) nhân vật

Dấu hiệu số (#) nhân vật

Câu hỏi đánh dấu nhân vật

ký tự điều khiển từ U + 0000 đến U + 001F, bao gồm (?):

  • Ký tự tab ngang (\ t)

  • Ký tự dòng (\ n)

  • Các vận chuyển trở lại (\ r) nhân vật

ký tự điều khiển từ U + 007F để U + 009F

Lưu ý rằng ngoài các ký tự được đề cập trong bài viết MSDN, Tôi cũng đã thêm % char cho mẫu kể từ khi tôi thấy ở một vài nơi mà mọi người đề cập đến nó là vấn đề. Tôi đoán một số điều này cũng phụ thuộc vào ngôn ngữ và công nghệ bạn đang sử dụng để truy cập vào lưu trữ bảng.

Nếu bạn phát hiện thêm các ký tự có vấn đề trong trường hợp của bạn, bạn có thể thêm các ký tự đó vào mẫu regex, không có gì khác cần phải thay đổi.

+0

nó đáng để thêm dấu "+" vào regex của bạn như đã đề cập bởi Hans Olav. Tôi nghĩ bạn đã thêm dấu% vào đó với cùng một lý do - nó được cho phép trong khóa, nhưng khó truy vấn cũng như dấu '+'. Tôi không chắc chắn 100% nhưng dường như tất cả các ký tự không thân thiện với URL phải được mã hóa để truy vấn ... –

+0

Cảm ơn Alexey và Hans. Tôi đã thêm dấu + vào mẫu regex. –

1

Ngoài những điều trên, bạn cũng không thể sử dụng dấu gạch dưới _ khi bắt đầu khóa phân vùng, lỗi được trả về là khóa bắt đầu bằng dấu gạch dưới không phải là khóa phân vùng hợp lệ.

Các vấn đề liên quan