Я часто вижу, как люди говорят "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
- ошибка или что-то странное. Он заканчивает строку, а затем пропускает строку?Чтобы перейти к диапазону со знаком, вы можете создать несколько функций, которые помогут вам. Этот список создаст функции, которые не приводятся, чтобы помочь в этом процессе перехода от неподписанного однобайтового диапазона int
[0-255]
к подписанному однобайтовому диапазону, который требуется символу[-128,127]
.pguint
предоставляет тип,uint1
который обеспечивает хранение в виде однобайтового целого без знака. Если вы способны компилировать и устанавливать расширения, вы должны это учитывать.pg_uchar
. Вы можете найтиinstall.sql
файл в этом хранилище.пример
Выписка из ЧТЕНИЯ
Теперь вы можете, например, сохранить значения в диапазоне
[0-255]
на столе.Преобразовать их в
bit(8)
Возможно, вы хотите очистить младшие два бита, вы можете сделать это с помощью BITWISE-AND,
источник