Có lý do chính đáng nào để tôi thấy VARCHAR (255) được sử dụng thường xuyên (trái ngược với độ dài khác) không?


158

Trong nhiều khóa học, sách và công việc, tôi đã thấy các trường văn bản được xác định là VARCHAR (255) là loại mặc định cho văn bản "ngắn". Có bất kỳ lý do chính đáng nào mà độ dài 255 được chọn thường xuyên như vậy, ngoài việc là một số tròn đẹp không? Đây có phải là một sự trì hoãn từ một thời điểm trong quá khứ khi có một lý do chính đáng (có hay không áp dụng ngày hôm nay)?

Tất nhiên, tôi nhận ra rằng một giới hạn chặt chẽ hơn sẽ lý tưởng hơn, nếu bạn bằng cách nào đó biết độ dài tối đa của chuỗi. Nhưng nếu bạn đang sử dụng VARCHAR (255) có thể chỉ ra rằng bạn không biết độ dài tối đa, chỉ có điều đó là một chuỗi "ngắn".


Lưu ý: Tôi đã tìm thấy câu hỏi này ( varchar (255) v tinyblob v tinytext ), trong đó nói rằng VARCHAR ( n ) yêu cầu n +1 byte lưu trữ cho n <= 255, n +2 byte dung lượng lưu trữ cho n > 255. Đây có phải là lý do duy nhất? Điều đó có vẻ tùy tiện, vì bạn sẽ chỉ lưu hai byte so với VARCHAR (256) và bạn có thể dễ dàng lưu hai byte khác bằng cách khai báo VARCHAR (253).

Câu trả lời:


109

Trong lịch sử, 255 ký tự thường có độ dài tối đa VARCHARtrong một số DBMS và đôi khi nó vẫn đạt mức tối đa hiệu quả nếu bạn muốn sử dụng UTF-8 và có cột được lập chỉ mục (vì giới hạn độ dài chỉ mục).


4
@CharlesBretana: nếu bạn đọc phần còn lại của câu bạn đã trích dẫn, bạn sẽ tìm thấy lời giải thích chính xác mà bạn đang yêu cầu.
hỗn loạn

2
@CharlesBretana: Bằng "UTF-8 giả", ý tôi là mã hóa "utf8" của MySQL, như tôi đã đề cập đến dự trữ (và bị giới hạn) 3 byte cho mỗi ký tự. Đây không phải là phiên bản rất tốt của UTF-8; nếu bạn muốn UTF-8 phong nha trong MySQL, bạn phải sử dụng mã hóa "utf8mb4" của nó. Nhưng mọi người có nhiều khả năng không biết điều đó và đi với "utf8", và nhiều khả năng muốn UTF-8 hơn bất kỳ mã hóa nào khác, vì vậy, uy tín, họ kết thúc với độ dài tối đa 255 ký tự trong VARCHAR. Kinh ngạc của bạn mặc dù.
hỗn loạn

3
@CharlesBretana: Bây giờ tôi đã giải thích nó ba lần và không một điều gì thay đổi. Giới hạn độ dài chỉ mục của MySQL vẫn là 767 byte, số byte cần thiết để mã hóa ký tự UTF-8 3 byte vẫn là 3 và sàn (767/3) vẫn là 255. Quyết tâm của bạn để tìm ra điều gì đó bị nhầm lẫn về niềm tin của người ăn xin .
hỗn loạn

1
@CharlesBretana (Xin lỗi vì đến trễ cả nhóm này) Tôi không phải là chuyên gia DB, nhưng tôi nghĩ điều hỗn loạn đang nói là: có một cột 'Fake UTF-8' có thể dài hơn 255 ký tự, nhưng chỉ mục sẽ chỉ hoạt động trên 255 ký tự đầu tiên của varchar, làm cho nó có hiệu quả tối đa của một cột nếu bạn muốn nó được lập chỉ mục đầy đủ. Bây giờ đó chỉ là những gì tôi hiểu về giải thích của anh ấy, tôi có thể sai, tôi không phải là một chuyên gia về các chỉ mục SQL.
Chúa tể Phanxicô

2
@CharlesBretana Nếu bạn nhìn đúng vào câu trả lời của Chaos, bạn sẽ nhận thấy nó được chia thành 2 phần: 1. Lý do lịch sử đằng sau Varchar (255) rất phổ biến (nó từng là tối đa trên một số DBMS cũ hơn), 2. Ngay cả ngày nay, nó vẫn là một hạn chế đối với một số người vì các giới hạn chỉ số đã thảo luận trước đó, Phần 1 và 2 không được liên kết. Phần 1 là câu trả lời thực sự cho câu hỏi, phần 2 là một ghi chú bên cạnh vẫn còn liên quan đến câu hỏi bởi vì nó giải thích tại sao ngay cả ngày nay nó vẫn có thể là một hạn chế. (TIẾP TỤC ->)
Đức Phanxicô

161

255 được sử dụng vì đó là số lượng ký tự lớn nhất có thể được tính bằng số 8 bit. Nó tối đa hóa việc sử dụng số lượng 8 bit, mà không yêu cầu một cách toàn bộ một byte khác để đếm các ký tự trên 255.

Khi được sử dụng theo cách này, VarChar chỉ sử dụng số byte + 1 để lưu trữ văn bản của bạn, do đó bạn cũng có thể đặt nó thành 255, trừ khi bạn muốn giới hạn cứng (như 50) cho số lượng ký tự trong trường.


90
Tôi thích cụm từ đó: "phù phiếm đòi hỏi toàn bộ byte khác". =)
MusiGenesis

7
Điều này có đúng với các DB trong đó varchars là UTF-8 không?
antak

1
@antak: Trong MySQL, sử dụng InnoDB, bất kỳ cột khóa nào cũng không thể lớn hơn 767 byte. Nếu cột VARCHAR là UTF8 (có nghĩa là mỗi char có thể mất tối đa 3 byte), thì độ dài tối đa cho phép của cột là sàn (767/3) = 255. Tôi giả sử "767" được chọn vì chính xác lý do đó.
BlueRaja - Daniel Pflughoeft

1
Nếu bộ ký tự làutf8 , varchar(85)là giới hạn cho phép vượt qua độ dài byte từ một đến hai byte. Nếu đó là utf8mb4varchar(63). Điều này rất có ý nghĩa bởi vì chúng là mức tối đa mà độ dài của VARCHAR có thể được mở rộng thông qua việc sử dụng ALTER TABLE trực tuyến . Do đó, tôi đã rút ra những con số đó bằng cách tạo một bảng có varchar(2) charset utf8cột và xem tôi có thể kéo dài bao xa ALGORITHM=INPLACE.
antak

Điều này càng có ý nghĩa hơn khi bạn xem xét rằng nhiều "cơ sở dữ liệu" Back In The Day đã được lưu trữ trên băng từ. Rất phổ biến để đọc dữ liệu trong các "khối" có kích thước bằng bội số của hai. Bằng cách này, dữ liệu được lưu trữ một cách hiệu quả nhất (và khi bạn đang chạy trên một máy tính lớn cũ, những hiệu quả nhỏ như thế là tối ưu hóa nó hoặc là phá vỡ nó).
TMN

23

Có lẽ bởi vì cả SQL Server và Sybase (để đặt tên hai tôi quen thuộc) đã từng có tối đa 255 ký tự trong số lượng ký tự trong một VARCHARcột. Đối với SQL Server, điều này đã thay đổi trong phiên bản 7 vào năm 1996/1997 hoặc lâu hơn ... nhưng thói quen cũ đôi khi rất khó khăn.


8
+1 để trích dẫn các DB và Phiên bản cụ thể. Và "Thói quen cũ chết cứng" có lẽ là câu trả lời chân thực nhất trong tất cả.
Andrew M

17

Tôi sẽ trả lời câu hỏi theo nghĩa đen: không , không có lý do chính đáng nào bạn thấy VARCHAR (255) được sử dụng thường xuyên như vậy (thực sự có những lý do , như được thảo luận trong các câu trả lời khác, chỉ là những lý do không tốt). Bạn sẽ không tìm thấy nhiều ví dụ về các dự án đã thất bại thảm hại vì kiến ​​trúc sư đã chọn VARCHAR (300) thay vì VARCHAR (255). Đây sẽ là một vấn đề gần như không đáng kể ngay cả khi bạn đang nói về CHAR thay vì VARCHAR.


1 byte trong số 255 là 0,4%. Đôi khi bạn quan tâm đến nửa phần trăm cuối cùng hoặc lâu hơn. Đôi khi bạn không. Nếu bạn lưu trữ và chi phí hoàn hảo lên đến hàng chục đô la, có lẽ bạn không quan tâm. Nếu họ chạy vào hàng triệu, họ có thể làm.
Edward Brey

2
@EdwardBrey: nếu Định luật Moore vẫn đúng, câu trả lời của tôi ở đây có giá trị gấp 16 lần so với khi tôi viết nó.
MusiGenesis

Trừ khi chúng tôi phát hiện ra nhiều hơn 16 lần máy tính có thể giúp chúng tôi. Tốc độ vẫn là một tính năng.
Edward Brey

14

Khi bạn nói 2^8bạn nhận được 256, nhưng các số trong thuật ngữ máy tính bắt đầu từ số 0. Vì vậy, sau đó bạn có255 , bạn có thể thăm dò nó trong mặt nạ internet cho IP hoặc trong chính IP.

255 là giá trị tối đa của số nguyên 8 bit: 11111111 = 255

cái đó có giúp ích không?


1
Với số nguyên, bạn đếm bắt đầu từ 0 và bạn kết thúc ở 255. Nhưng với các vị trí trong chuỗi, bạn đếm bắt đầu từ vị trí số 1, do đó, không có ý nghĩa gì khi kết thúc ở vị trí thứ 256, vì bạn bắt đầu từ 1 thay vì 0? Tôi chưa đồng ý với varchar (256) hoàn toàn, vì kết quả chuỗi_length (), nhưng tôi thực sự không chắc chắn.
Hold OfferHunger

1
Các chuỗi @Hold OfferHunger trong cơ sở dữ liệu có thể có độ dài bằng 0 ký tự, vì vậy phạm vi độ dài cho phép khi độ dài được lưu trữ trong tám bit nằm trong khoảng từ 0 đến 255. Nếu bạn muốn nói rằng tất cả các chuỗi phải có ít nhất một ký tự thì bạn có thể hỗ trợ chuỗi 256 ký tự với độ dài tám bit.
phoog

7

Lưu ý: Tôi đã tìm thấy câu hỏi này ( varchar (255) v tinyblob v tinytext ), trong đó nói rằng VARCHAR ( n ) yêu cầu n +1 byte lưu trữ cho n <= 255, n +2 byte dung lượng lưu trữ cho n > 255. Đây có phải là lý do duy nhất? Điều đó có vẻ tùy tiện, vì bạn sẽ chỉ lưu hai byte so với VARCHAR (256) và bạn có thể dễ dàng lưu hai byte khác bằng cách khai báo VARCHAR (253).

Không, bạn không lưu hai byte bằng cách khai báo 253. Việc triển khai varchar rất có thể là bộ đếm độ dài và chiều dài thay đổi, mảng không có giá trị. Điều này có nghĩa là nếu bạn lưu trữ "xin chào" trong một varchar (255), bạn sẽ chiếm 6 byte: một byte cho độ dài (số 5) và 5 byte cho năm chữ cái.


3
Tuyên bố này không đúng với tất cả các cơ sở dữ liệu. nhiều cơ sở dữ liệu sử dụng các trường varchar có kích thước đã cho trong các bảng để chúng không phải di chuyển các hàng xung quanh khi trường đó được thay đổi cho một hàng.
Độc thân Tăng tốc

vâng bạn đúng nó phụ thuộc vào việc thực hiện. Bạn phải kiểm tra hướng dẫn sử dụng của nhà cung cấp để xem trường hợp nào
Stefano Borini

2
Nó có thể được cho phép, nhưng thực hiện VARCHARtheo cách đó đánh bại toàn bộ quan điểm sử dụng VARCHARthay vì CHAR.
dan04

4

Số 1 byte không dấu có thể chứa phạm vi [0-255]. Vì vậy, khi bạn nhìn thấy 255, chủ yếu là do các lập trình viên nghĩ về cơ sở 10(lấy trò đùa?) :)

Trên thực tế, trong một thời gian, 255 là kích thước lớn nhất bạn có thể cung cấp VARCHAR trong MySQL và có những lợi thế khi sử dụng VARCHAR so với TEXT với lập chỉ mục và các vấn đề khác.


4

Trong nhiều ứng dụng, như MsOffice (cho đến phiên bản 2000 hoặc 2002), số lượng ký tự tối đa trên mỗi ô là 255. Di chuyển dữ liệu từ các chương trình có thể xử lý hơn 255 ký tự trên mỗi trường sang / từ các ứng dụng đó là một cơn ác mộng. Hiện tại, giới hạn ngày càng ít cản trở.


2

0000 0000 -> đây là số nhị phân 8 bit. Một chữ số đại diện cho một chút.

Bạn đếm như vậy:

0000 0000 → (0)

0000 0001 → (1)

0000 0010 → (2)

0000 0011 → (3)

Mỗi bit có thể là một trong hai giá trị: bật hoặc tắt. Tổng số cao nhất có thể được biểu diễn bằng phép nhân:

2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 - 1 = 255

Hoặc là

2^8 - 1. 

Chúng tôi trừ đi một vì số đầu tiên là 0.

255 có thể giữ khá nhiều (không có ý định chơi chữ) của các giá trị.

Khi chúng ta sử dụng nhiều bit hơn, giá trị tối đa tăng theo cấp số nhân. Do đó, cho nhiều mục đích, việc thêm nhiều bit là quá mức cần thiết.


1

Một lý do khác có thể là trong các thư viện truy cập dữ liệu rất cũ trên Windows như RDO và ADO (phiên bản COM không phải ADO.NET), bạn phải gọi một phương thức đặc biệt, GetChunk, để lấy dữ liệu từ một cột có hơn 255 ký tự. Nếu bạn giới hạn một cột varchar ở 255, mã bổ sung này là không cần thiết.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.