Saya sering melihat orang membicarakannya "char"
. Saya tidak pernah menggunakannya. Itu didefinisikan dalam dokumen sebagai,
Jenis "char" (perhatikan tanda kutip) berbeda dari char (1) karena hanya menggunakan satu byte penyimpanan. Ini digunakan secara internal dalam katalog sistem sebagai jenis enumerasi sederhana.
Dan selanjutnya,
"char" 1 byte single-byte internal type
Jadi, jika satu byte, apa domainnya dan bagaimana Anda menggunakannya? Apakah ditandatangani atau tidak ditandatangani? Dalam posting ini oleh @Erwin Brandstetter dia menjabarkannya , tapi saya masih bingung. Dia menggunakan ascii()
dan chr()
, dan menyediakan ini
SELECT i
, chr(i)::"char" AS i_encoded
, ascii(chr(i)::"char") AS i_decoded
FROM generate_series(1,256) i;
Itu melakukan sesuatu yang sangat aneh antara 10 dan 11.
i | i_encoded | i_decoded
-----+-----------+-----------
...
8 | \x08 | 8
9 | | 9
10 | +| 10
| | -- WTF is going on here.
11 | \x0B | 11
12 | \x0C | 12
...
Ini juga menjadi sangat aneh di sini:
126 | ~ | 126
127 | \x7F | 127
128 | | 128
129 | | 128
130 | | 128
131 | | 128
Mengapa segala sesuatu di utara dari 128 diterjemahkan sebagai 128? Tetapi untuk mengambil bizzare sedikit, setelah 192 ada saklar dan mereka diterjemahkan sebagai 192 ..
190 | | 128
191 | | 128
192 | | 192
193 | | 192
194 | | 192
195 | | 192
196 | | 192
197 | | 192
Erwin berkata
Ada beberapa karakter yang tidak dimaksudkan untuk tampilan. Jadi, enkode sebelum Anda menyimpan dan decode sebelum Anda menampilkan ...
Saya tidak yakin mengapa kita harus menyandikan sama sekali jika kita melakukan persis apa yang ditanyakan
CREATE TABLE foo AS
SELECT i::"char"
FROM generate_series(-128,127) i;
Itu bekerja dengan baik. Kita bisa mendapatkan int kembali menggunakan
SELECT i::int FROM foo;
Singkatnya,
- Apa yang dilakukan kode Erwin antara 10-11 di mana i null?
- Mengapa 128 diulang berkali-kali?
- Mengapa 192 diulang berkali-kali?
Bagaimana saya memicu ketidakmampuan untuk menyimpan 0, ketika Erwin mengatakan Anda tidak dapat menyandikan 0 dengan cara ini (karakter nol tidak diizinkan)
CREATE TABLE foo AS SELECT 0::int::"char" AS x; SELECT x::int FROM foo; x --- 0
psql
adalah bug atau sesuatu yang aneh. Itu selesai garis, dan kemudian melewatkan garis?