Tôi đồng ý với mọi thứ được nói bởi a_horse_with_no_name và tôi thường đồng ý với lời khuyên nhận xét của Erwin:
Không, char kém hơn (và lỗi thời). văn bản và varchar thực hiện (gần như) giống nhau.
metadata
Với một ngoại lệ nhỏ, lần duy nhất tôi sử dụng char()
là khi tôi muốn siêu dữ liệu nói điều này PHẢI có ký tự x. Mặc dù tôi biết rằng char()
chỉ phàn nàn nếu đầu vào vượt quá giới hạn, tôi sẽ thường xuyên bảo vệ chống lại sự xâm nhập trong một CHECK
ràng buộc. Ví dụ,
CREATE TABLE foo (
x char(10) CHECK ( length(x) = 10 )
);
INSERT INTO foo VALUES (repeat('x', 9));
Tôi làm điều này vì một vài lý do,
char(x)
đôi khi được suy ra với các trình tải lược đồ như là một cột có chiều rộng cố định. Điều này có thể tạo ra sự khác biệt trong ngôn ngữ được tối ưu hóa cho các chuỗi có độ rộng cố định.
- Nó thiết lập một quy ước có ý nghĩa và dễ dàng thực thi. Tôi có thể viết một trình nạp lược đồ bằng ngôn ngữ để tạo mã từ quy ước này.
Cần một ví dụ về nơi tôi có thể làm điều này,
- Tuy nhiên, viết tắt trạng thái hai chữ cái vì danh sách này có thể được liệt kê, tôi thường sẽ làm nó với một
ENUM
.
- Số nhận dạng xe
- Số mô hình (có kích thước cố định)
Lỗi
Lưu ý rằng một số người có thể không thoải mái với sự không phù hợp của thông báo lỗi ở cả hai phía của giới hạn, nhưng nó không làm phiền tôi
test=# INSERT INTO foo VALUES (repeat('x', 9));
ERROR: new row for relation "foo" violates check constraint "foo_x_check"
DETAIL: Failing row contains (xxxxxxxxx ).
test=# INSERT INTO foo VALUES (repeat('x', 11));
ERROR: value too long for type character(10)
Tương phản với varchar
Hơn nữa, tôi nghĩ rằng gợi ý trên phù hợp thực sự tốt với một quy ước hầu như luôn luôn sử dụngtext
. Bạn hỏi về varchar(n)
quá. Tôi không bao giờ sử dụng nó . Ít nhất, tôi không thể nhớ lần cuối cùng tôi sử dụng varchar(n)
.
- Nếu một thông số có trường độ rộng tĩnh mà tôi tin tưởng, tôi sử dụng
char(n)
,
- Mặt khác, tôi sử dụng
text
có hiệu quả varchar
(không giới hạn)
Nếu tôi tìm thấy một thông số có các khóa văn bản có độ dài thay đổi có ý nghĩa và tôi tin rằng nó có độ dài tối đa không đổi, tôi cũng sẽ sử dụng varchar(n)
. Tuy nhiên, tôi không thể nghĩ ra bất cứ điều gì phù hợp với tiêu chí đó.
Ghi chú bổ sung
Hỏi đáp liên quan: