Vedo spesso persone che parlano "char"
. Non l'ho mai usato. È definito nei documenti come
Il tipo "char" (notare le virgolette) è diverso da char (1) in quanto utilizza solo un byte di memoria. È utilizzato internamente nei cataloghi di sistema come tipo di enumerazione semplicistico.
E inoltre,
"char" 1 byte single-byte internal type
Quindi, se è un byte, qual è il dominio e come lo useresti? È firmato o non firmato? In questo post di @Erwin Brandstetter lo espone , ma sono ancora confuso. Sta usando ascii()
e chr()
e fornisce questo
SELECT i
, chr(i)::"char" AS i_encoded
, ascii(chr(i)::"char") AS i_decoded
FROM generate_series(1,256) i;
Sta facendo qualcosa di veramente strano tra 10 e 11.
i | i_encoded | i_decoded
-----+-----------+-----------
...
8 | \x08 | 8
9 | | 9
10 | +| 10
| | -- WTF is going on here.
11 | \x0B | 11
12 | \x0C | 12
...
Diventa anche molto strano qui:
126 | ~ | 126
127 | \x7F | 127
128 | | 128
129 | | 128
130 | | 128
131 | | 128
Perché tutto il nord di 128 viene decodificato come 128? Ma per aumentare un po 'il bizzare, dopo 192 c'è un interruttore e vengono decodificati come 192 ..
190 | | 128
191 | | 128
192 | | 192
193 | | 192
194 | | 192
195 | | 192
196 | | 192
197 | | 192
Dice Erwin
Esistono diversi caratteri non destinati alla visualizzazione. Quindi codifica prima di archiviare e decodificare prima di visualizzare ...
Non sono sicuro del motivo per cui dovremmo codificare affatto se stiamo facendo esattamente quello che ci si pone
CREATE TABLE foo AS
SELECT i::"char"
FROM generate_series(-128,127) i;
Funziona benissimo. Possiamo riavere indietro gli ints usando
SELECT i::int FROM foo;
Quindi in breve,
- Cosa sta facendo il codice di Erwin tra il 10 e l'11 in cui l'i diventa nullo?
- Perché 128 viene ripetuto così tante volte?
- Perché 192 è ripetuto così tante volte?
Come posso innescare l'impossibilità di memorizzare 0, quando Erwin dice che non è possibile codificare 0 in questo modo (carattere null non consentito)
CREATE TABLE foo AS SELECT 0::int::"char" AS x; SELECT x::int FROM foo; x --- 0
psql
sia un bug o qualcosa di strano. Termina la linea e quindi salta una linea?