Python 为什么appengine数据库键的排序与字符串不同

Python 为什么appengine数据库键的排序与字符串不同,python,database,google-app-engine,Python,Database,Google App Engine,我发现这很有趣,很好奇为什么db键的顺序不同于字符串 如果在Python开发环境中测试以下示例(对于服务器也是如此),您将看到以下(有些意外)行为 str1 = 'agpyb21hbmNlYXBwchILEglVc2VyTW9kZWwY4-agBgw' str2 = 'agpyb21hbmNlYXBwchILEglVc2VyTW9kZWwYkoWBBQw' 结果:str

我发现这很有趣,很好奇为什么db键的顺序不同于字符串

如果在Python开发环境中测试以下示例(对于服务器也是如此),您将看到以下(有些意外)行为

str1 = 'agpyb21hbmNlYXBwchILEglVc2VyTW9kZWwY4-agBgw'
str2 = 'agpyb21hbmNlYXBwchILEglVc2VyTW9kZWwYkoWBBQw'
结果:
str
TRUE

然而,如果我们做到以下几点

key1 = db.Key(str1)
key2 = db.Key(str2)

结果:
key1
FALSE

它们在提取运算符中使用不同的排序规则。我猜db.Key()很有可能绑定到db属性。
因此,<操作符'看到'不同的数据,第一个是(比如)基于Ut8源代码的,第二个是基于一些奇怪的db排序规则的,其中破折号有特定的含义(在我们得到规范之前未知)。在过去,我曾经历过一些痛苦:通过DB接口传输大量数据。但是它本身就很复杂。

您比较的是字符串编码的键,它们已经通过
base64
传递,以便安全地输出为文本。Base64不保留字符串顺序。如果您使用
base64.urlsafe\u b64decode
对它们进行解码,它们将按照您期望的顺序进行比较。

这与国际化没有任何关系。不要猜测何时可以阅读源代码
Key
重载
\u cmp\u
(在
google.appengine.api.datastore\u类型中)以基于关键组件进行比较。这与国际化无关。是的,是我的错。我没有意识到上下文。几年前,我们在一个非常相似的数据模式上与一位客户进行了“血泪交加”,但这里的情况只是OT