PostgreSQL中的unicode字符串是否允许通过Python使用空字节?

PostgreSQL中的unicode字符串是否允许通过Python使用空字节?,python,postgresql,unicode,Python,Postgresql,Unicode,unicode字符串中是否允许空字节 我不是问utf8,我是指unicode字符串的高级对象表示 背景 我们通过Python在PostgreSQL中存储包含空字节的unicode字符串 如果我们再次读取,字符串将在空字节处剪切。因为字符串基本上只是数据和指针,所以可以将空值保存在其中。但是,由于null表示字符串的结尾(“null终止符”),因此在读取之前不知道大小的情况下,无法读取null以外的内容 因此,您似乎应该将数据存储在二进制中,并将其作为缓冲区读取 祝你好运 Python本身完全能够

unicode字符串中是否允许空字节

我不是问utf8,我是指unicode字符串的高级对象表示

背景

我们通过Python在PostgreSQL中存储包含空字节的unicode字符串


如果我们再次读取,字符串将在空字节处剪切。

因为字符串基本上只是数据和指针,所以可以将空值保存在其中。但是,由于null表示字符串的结尾(“null终止符”),因此在读取之前不知道大小的情况下,无法读取null以外的内容

因此,您似乎应该将数据存储在二进制中,并将其作为缓冲区读取


祝你好运

Python本身完全能够同时拥有字节字符串和Unicode字符串,其中空字符的值为零。但是,如果调用用C实现的库,该库可能会使用在第一个空字符处停止的C约定。

关于数据库端,PostgreSQL本身不允许在char/text/varchar字段的字符串中使用空字节(
'\0'
),因此,如果尝试存储包含它的字符串,则会收到错误。例如:

postgres=# SELECT convert_from('foo\000bar'::bytea, 'unicode');
ERROR:  22021: invalid byte sequence for encoding "UTF8": 0x00

如果您确实需要存储这些信息,那么您可以在PostgreSQL端使用
bytea
数据类型。确保正确编码。

unicode字符串是一系列代码点。没有字节。有一个问题。这就是你要找的吗?
“”。join([u'a',chr(0),u'b'])
对我来说很好。实际上,这只是在函数中提到的,在PostgreSQL手册中:不允许使用NULL(0)字符,因为文本数据类型不能存储这样的字节。--但它可能是任何utf8(和unicode)文本的一部分。问题是关于Python的。
bytea
还有其他问题——特别是,用于表示它们的默认有线协议随着时间的推移而改变(在8.4->9.1时代的某个地方,IIRC),因此,将较旧的客户端库与具有默认配置的较新服务器一起使用可能会导致数据存储损坏。查找默认值:这是一个9.0更改,导致较旧的客户端库期望使用现在默认的
hex
格式的传统
escape
格式解析内容。@CharlesDuffy,我想你会感到困惑,改变的是默认的字符串表示,现在它接受了两个
escape
hex
,你可以配置
bytea_输出
,用于显示,但对于输入,这两个都仍然被接受,所以即使使用较旧的库,你也可以简单地配置
bytea_输出=escape
和瞧……)是的,您可以对其进行配置,但您需要了解更改才能进行配置。如果数据库中的数据与由于尚未进行更改而输入的数据不匹配,则可能会有点混乱,这就是为什么需要注意它的原因,如本文所述。:)