Ich sehe oft Leute darüber reden "char"
. Ich habe es nie benutzt. Es ist in den Dokumenten definiert als:
Der Typ "char" (beachten Sie die Anführungszeichen) unterscheidet sich von char (1) darin, dass nur ein Byte Speicher verwendet wird. Es wird intern in den Systemkatalogen als vereinfachter Aufzählungstyp verwendet.
Und weiter,
"char" 1 byte single-byte internal type
Also, wenn es ein Byte ist, was ist die Domain und wie würden Sie sie nutzen? Ist es signiert oder nicht signiert? In diesem Beitrag von @Erwin Brandstetter legt er es dar , aber ich bin immer noch verwirrt. Er benutzt ascii()
und chr()
und stellt dies zur Verfügung
SELECT i
, chr(i)::"char" AS i_encoded
, ascii(chr(i)::"char") AS i_decoded
FROM generate_series(1,256) i;
Das macht etwas wirklich Seltsames zwischen 10 und 11.
i | i_encoded | i_decoded
-----+-----------+-----------
...
8 | \x08 | 8
9 | | 9
10 | +| 10
| | -- WTF is going on here.
11 | \x0B | 11
12 | \x0C | 12
...
Hier wird es auch richtig komisch:
126 | ~ | 126
127 | \x7F | 127
128 | | 128
129 | | 128
130 | | 128
131 | | 128
Warum wird alles nördlich von 128 als 128 dekodiert? Aber um das Bizzare ein wenig zu verbessern, gibt es nach 192 einen Schalter und sie werden als 192 dekodiert.
190 | | 128
191 | | 128
192 | | 192
193 | | 192
194 | | 192
195 | | 192
196 | | 192
197 | | 192
Erwin sagt
Es gibt mehrere Zeichen, die nicht zur Anzeige bestimmt sind. Codieren Sie also, bevor Sie speichern, und dekodieren Sie, bevor Sie ...
Ich bin mir nicht sicher, warum wir überhaupt codieren sollten, wenn wir genau das tun, was diese Fragen verlangen
CREATE TABLE foo AS
SELECT i::"char"
FROM generate_series(-128,127) i;
Das funktioniert gut. Wir können die Ints mit wieder rausholen
SELECT i::int FROM foo;
Kurz gesagt,
- Was macht Erwins Code zwischen 10 und 11, wo das i null wird?
- Warum wird 128 so oft wiederholt?
- Warum wird 192 so oft wiederholt?
Wie löse ich die Unfähigkeit aus, 0 zu speichern, wenn Erwin sagt, dass Sie 0 auf diese Weise nicht codieren können (Nullzeichen nicht zulässig)?
CREATE TABLE foo AS SELECT 0::int::"char" AS x; SELECT x::int FROM foo; x --- 0
quelle
psql
ein Fehler oder etwas Seltsames ist. Es endet die Zeile und überspringt dann eine Zeile?Um zum vorzeichenbehafteten Bereich zu wechseln, können Sie einige unterstützende Funktionen erstellen. Diese Liste erstellt Funktionen, die nicht umgewandelt werden , um diesen Prozess beim Übergang von einem vorzeichenlosen 1-Byte-Int-Bereich
[0-255]
zu einem vorzeichenbehafteten 1-Byte-Bereich, den das Zeichen benötigt, zu unterstützen[-128,127]
.pguint
stellt einen Typuint1
bereit, der die Speicherung als Int ohne Vorzeichen mit einem Byte vorsieht. Wenn Sie Erweiterungen kompilieren und installieren können, sollten Sie dies berücksichtigen.pg_uchar
. Sie finden dieinstall.sql
Datei in diesem Repository.Beispiel
Ein Auszug aus der README
Jetzt können Sie beispielsweise die Werte im Bereich von
[0-255]
in der Tabelle speichern .Konvertieren Sie sie in
bit(8)
Vielleicht möchten Sie die zwei Bits niedrigerer Ordnung löschen, das können Sie mit BITWISE-AND tun,
quelle