Google app engine AppEngine数据存储密钥名称中允许的字符

Google app engine AppEngine数据存储密钥名称中允许的字符,google-app-engine,character-encoding,key,google-cloud-datastore,Google App Engine,Character Encoding,Key,Google Cloud Datastore,如果我想在Google AppEngine中使用,那么键名是什么类型的字符串?它是使用Unicode字符还是二进制字符串 更具体地说,如果我想让我的密钥名由8位二进制数据组成,有没有办法做到这一点?如果不是,我至少可以使用7位二进制数据吗?或者是否有保留值?例如,它是否使用NULL作为字符串的结尾标记?GAE文档没有对键名字符串指定任何限制。因此,包含任何内容的字符串都应该是有效的 如果要使用二进制数据作为标识符,则应将其编码为字符串。您可以使用任何一种方法:最常用的方法似乎是Base64(3字

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


更具体地说,如果我想让我的密钥名由8位二进制数据组成,有没有办法做到这一点?如果不是,我至少可以使用7位二进制数据吗?或者是否有保留值?例如,它是否使用NULL作为字符串的结尾标记?

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


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

同时,我有一些时间通过生成一组具有二进制名称的键,然后执行一个仅限种类的查询以取回所有键来实际测试这一点。结果如下:

  • 任何二进制字符都可以。如果创建的实体的键名为“\x00\x13\x127\x255”,则查询将找到该实体,其键名将返回相同的字符串
  • AppEngine仪表板、数据库查看器和其他工具只会忽略不可显示的字符,因此键名
    “\x00test”
    \x00\x00test
    都将显示为单独的实体,但它们的键都显示为
    “test”
  • 我已经测试了所有可用的AppEngine工具,只是控制台中的一些基本工具,所以可能还有其他工具被这些键弄糊涂了
  • 密钥是UTF-8编码的,因此128到255之间的任何字符都会占用2字节的存储空间
据此,我将提出以下建议:

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

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


通过查看,我认为密钥名的UTF-8编码发生在API中(在构建时),而不是在BigTable中,因此如果您真的想在存储空间最大化上发疯,那么可以构建自己的协议缓冲区并存储完整的8位数据,而无需额外开销。但这可能会带来麻烦。

我遇到了一个重要的限制:
一个与regex'..*.'.'.'匹配的名称是保留/只读的(请参阅,它定义了密钥的协议缓冲区布局)非UT8和'/'字符和数字<0似乎也不被鼓励。