我经常看到人们在谈论"char"
。我没用过 在文档中定义为
类型“ char”(请注意引号)与char(1)的不同之处在于,它仅使用一个字节的存储空间。在系统目录中内部使用它作为一种简单的枚举类型。
并进一步,
"char" 1 byte single-byte internal type
那么,如果它是一个字节,则域是什么,您将如何使用它?它是签名的还是未签名的?在@Erwin Brandstetter的这篇文章中,他对此进行了阐述,但我仍然感到困惑。他正在使用ascii()
和chr()
,并提供了
SELECT i
, chr(i)::"char" AS i_encoded
, ascii(chr(i)::"char") AS i_decoded
FROM generate_series(1,256) i;
这在10到11之间确实很奇怪。
i | i_encoded | i_decoded
-----+-----------+-----------
...
8 | \x08 | 8
9 | | 9
10 | +| 10
| | -- WTF is going on here.
11 | \x0B | 11
12 | \x0C | 12
...
这里也真的很奇怪:
126 | ~ | 126
127 | \x7F | 127
128 | | 128
129 | | 128
130 | | 128
131 | | 128
为什么将128以北的所有内容都解码为128?但是,为了使座谈会稍微增加一点,在192之后有一个开关,它们被解码为192。
190 | | 128
191 | | 128
192 | | 192
193 | | 192
194 | | 192
195 | | 192
196 | | 192
197 | | 192
欧文说
有几个字符不适合显示。因此,在存储之前先编码,在显示之前先解码...
我不确定为什么我们要完全编码,即使我们正在做的是问题所要求的
CREATE TABLE foo AS
SELECT i::"char"
FROM generate_series(-128,127) i;
很好 我们可以使用
SELECT i::int FROM foo;
简而言之,
- 在i为空的10-11之间,欧文的代码在做什么?
- 为什么重复128次如此多次?
- 为什么192次重复这么多次?
当Erwin说您无法以这种方式编码0(不允许空字符)时,如何触发无法存储0
CREATE TABLE foo AS SELECT 0::int::"char" AS x; SELECT x::int FROM foo; x --- 0
psql
是错误或怪异的东西。它完成了该行,然后跳过了一行?