Я часто вижу, как люди говорят "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;
Короче говоря,
- Что код Эрвина делает между 10-11, где я становится нулевым?
- Почему 128 повторяется так много раз?
- Почему 192 повторяется так много раз?
Как вызвать неспособность хранить 0, когда Эрвин говорит, что вы не можете кодировать 0 таким образом (нулевой символ не разрешен)
CREATE TABLE foo AS SELECT 0::int::"char" AS x; SELECT x::int FROM foo; x --- 0
psql
- ошибка или что-то странное. Он заканчивает строку, а затем пропускает строку?