如果我在Google AppEngine中使用,那麼鍵名是什麼樣的字符串?它使用Unicode字符還是二進制字符串?AppEngine數據存儲區密鑰名稱中允許的字符
更具體地說,如果我想讓我的密鑰名由8位二進制數據組成,有沒有辦法做到這一點?如果沒有,我可以至少使用7位二進制數據嗎?還是有任何保留值?例如,它是否使用NULL作爲字符串結束標記?
如果我在Google AppEngine中使用,那麼鍵名是什麼樣的字符串?它使用Unicode字符還是二進制字符串?AppEngine數據存儲區密鑰名稱中允許的字符
更具體地說,如果我想讓我的密鑰名由8位二進制數據組成,有沒有辦法做到這一點?如果沒有,我可以至少使用7位二進制數據嗎?還是有任何保留值?例如,它是否使用NULL作爲字符串結束標記?
GAE文檔沒有對關鍵字字符串指定任何限制。因此,任何含有的字符串應該有效。
如果您想使用二進制數據作爲標識符,那麼您應該將其編碼爲一個字符串。您可以使用任何binary-to-text encoding方法:大多數使用似乎是Base64(3個字節= 4個字符)和BinHex(1個字節= 2個字符)。
我同時有一段時間通過生成一串帶有二進制名稱的密鑰來實際測試這一點,然後執行一種僅用於查詢來獲取所有密鑰的查詢。這裏是結果:
"\x00\x13\x127\x255"
的實體,則查詢將查找此實體,並且其密鑰名稱將返回相同的字符串"\x00test"
和\x00\x00test
都將顯示爲獨立的實體,但他們的鑰匙都顯示爲"test"
從此,我就得出了以下建議:
旁白:
我會接受@PeterKnego的答案,而不是這個,因爲這個基本上只確認和擴展關於他已經正確假設的事情。
從通過source code of the Java API看,我認爲,關鍵名稱的UTF-8編碼發生在API中(在構建protocol buffer),而不是在BigTable的,所以如果你真的想要去堅果在存儲空間最大化時,它可以建立自己的協議緩衝區並存儲完整的8位數據而無需開銷。但這可能是要求麻煩...
我遇到了一個重要的限制:'匹配正則表達式的名稱'__。* __'是保留/只讀的(參見[entity.proto](https:/ /github.com/google/googleapis/blob/master/google/datastore/v1beta3/entity.proto#L54),它定義了密鑰的協議緩衝區佈局) – 2015-10-11 15:20:59