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

Are null bytes allowed in unicode strings in PostgreSQL via Python?

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

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

背景

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

如果我们再次读取,字符串会在空字节处被截断。

由于字符串基本上只是数据和指针,您可以在其中保存空值。但是,由于 null 表示字符串的末尾 ("null terminator "),如果不知道读取前的大小,则无法读取超出 null 的内容。

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

祝你好运!

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

关于数据库方面,PostgreSQL 本身不允许 char/text/varchar 字段上的字符串中存在空字节 ('[=11=]'),因此如果您尝试存储包含它的字符串,则会收到错误消息。示例:

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

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