AppEngine数据存储区中的允许字符键名称

时间:2014-09-23 21:49:29

标签: google-app-engine character-encoding key google-cloud-datastore

如果我在Google AppEngine中使用create a named key,那么键名是什么类型的字符串?它是使用Unicode字符还是二进制字符串?

更具体地说,如果我想让我的密钥名由8位二进制数据组成,我有办法吗?如果没有,我至少可以使用7位二进制数据吗?或者有任何保留值?是否使用NULL作为End-Of-String标记,例如?

2 个答案:

答案 0 :(得分:3)

GAE文档未指定对键名字符串的任何限制。因此,任何内容的字符串都应该有效。

如果要将二进制数据用作标识符,则应将其编码为String。您可以使用任何binary-to-text encoding方法:最常用的似乎是Base64(3个字节= 4个字符)和BinHex(1个字节= 2个字符)。

答案 1 :(得分:2)

我同时有一些时间通过生成一堆带有二进制名称的密钥然后执行一个只有类型的查询来获取所有密钥来实际测试它。结果如下:

  • 任何二进制字符都可以。如果您创建一个键名为"\x00\x13\x127\x255"的实体,查询将找到此实体,其键名将返回相同的字符串
  • AppEngine仪表板,数据库查看器和其他工具只会省略不可显示的字符,因此键名"\x00test"\x00\x00test都将显示为单独的实体,但它们的键是均显示为"test"
  • 测试了所有可用的AppEngine工具,只是控制台中的一些基础知识,因此可能有其他工具会被这些密钥搞糊涂...
  • 密钥是UTF-8编码的,因此128到255之间的任何字符都占用2个字节的存储空间

由此,我将得出以下建议:

  • 如果您需要能够使用AppEngine控制台中的单个实体并且需要通过密钥识别它们,则只能使用可打印字符,因此需要将二进制密钥名称编码为{{3}中的字符串}(十六进制; 50%开销),Base16(33%开销)或Base64(25%开销)
  • 如果您不关心密钥可读性,但需要尽可能多地将数据打包到密钥名称中并使用最少的存储空间,请使用Base128编码(即仅7位;开销为14%)以避免隐式UTF -8编码( 50%开销!)的8位数据数据

旁白:

我会接受@ PeterKnego的答案而不是这个答案,因为这个答案基本上只是确认并扩展了他已经正确假设的内容。

通过查看Base85,我认为密钥名称的UTF-8编码发生在API中(同时构建source code of the Java API)而不是在BigTable中,所以如果你真的想在存储空间最大化上坚持下去,可能可以构建自己的协议缓冲区并存储完整的8位数据而不会产生开销。但这可能是在寻找麻烦......