Tôi thường thấy mọi người nói về "char"
. Tôi chưa bao giờ sử dụng nó. Nó được định nghĩa trong các tài liệu là,
Loại "char" (lưu ý các trích dẫn) khác với char (1) ở chỗ nó chỉ sử dụng một byte lưu trữ. Nó được sử dụng nội bộ trong các danh mục hệ thống như là một kiểu liệt kê đơn giản.
Và xa hơn,
"char" 1 byte single-byte internal type
Vì vậy, nếu đó là một byte, tên miền là gì và bạn sẽ sử dụng nó như thế nào? Được ký hay chưa ký? Trong bài đăng này của @Erwin Brandstetter, anh ấy đã đưa nó ra , nhưng tôi vẫn bối rối. Ông đang sử dụng ascii()
và chr()
và cung cấp này
SELECT i
, chr(i)::"char" AS i_encoded
, ascii(chr(i)::"char") AS i_decoded
FROM generate_series(1,256) i;
Đó là làm một cái gì đó thực sự kỳ lạ giữa 10 và 11.
i | i_encoded | i_decoded
-----+-----------+-----------
...
8 | \x08 | 8
9 | | 9
10 | +| 10
| | -- WTF is going on here.
11 | \x0B | 11
12 | \x0C | 12
...
Nó cũng trở nên thực sự kỳ lạ ở đây:
126 | ~ | 126
127 | \x7F | 127
128 | | 128
129 | | 128
130 | | 128
131 | | 128
Tại sao mọi thứ ở phía bắc của 128 được giải mã là 128? Nhưng để tăng tốc độ lên một chút, sau 192 có một công tắc và chúng được giải mã thành 192 ..
190 | | 128
191 | | 128
192 | | 192
193 | | 192
194 | | 192
195 | | 192
196 | | 192
197 | | 192
Erwin nói
Có một số ký tự không có nghĩa là để hiển thị. Vì vậy, mã hóa trước khi bạn lưu trữ và giải mã trước khi bạn hiển thị ...
Tôi không chắc tại sao chúng ta nên mã hóa tất cả mặc dù nếu chúng ta đang làm chính xác những gì câu hỏi đó yêu cầu
CREATE TABLE foo AS
SELECT i::"char"
FROM generate_series(-128,127) i;
Điều đó làm việc tốt. Chúng ta có thể lấy lại ints bằng cách sử dụng
SELECT i::int FROM foo;
Vì vậy, trong ngắn hạn,
- Mã của Erwin đang làm gì trong khoảng thời gian từ 10-11 đến khi tôi không có giá trị?
- Tại sao 128 lặp đi lặp lại nhiều lần như vậy?
- Tại sao 192 lặp đi lặp lại nhiều lần như vậy?
Làm cách nào để tôi kích hoạt không thể lưu trữ 0, khi Erwin nói rằng bạn không thể mã hóa 0 theo cách này (ký tự null không được phép)
CREATE TABLE foo AS SELECT 0::int::"char" AS x; SELECT x::int FROM foo; x --- 0
psql
là một lỗi hoặc một cái gì đó kỳ lạ. Nó kết thúc dòng, và sau đó bỏ qua một dòng?