私はよく人が話して"char"
いるのを見ます。使ったことがない。それはドキュメントで次のように定義されています:
タイプ「char」(引用符に注意)は、1バイトのストレージのみを使用するという点でchar(1)とは異なります。これは、単純な列挙型としてシステムカタログで内部的に使用されます。
そしてさらに、
"char" 1 byte single-byte internal type
それで、それが1バイトである場合、ドメインは何であり、どのようにそれを利用しますか?署名されていますか、署名されていませんか?@Erwin Brandstetterによるこの投稿では、彼はそれをレイアウトしていますが、私はまだ混乱しています。彼はand を使用して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としてデコードされるのはなぜですか?しかし、bizzareを少し上げるために、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;
それはうまくいきます。intを使用して戻すことができます
SELECT i::int FROM foo;
要するに、
- 私がnullになる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
バグか変なものだと思います。それは行の終わりになり、次に行をスキップしますか?