Tại sao trong lịch sử người ta sử dụng 255 chứ không phải 256 cho cường độ trường cơ sở dữ liệu?


188

Bạn thường thấy các trường cơ sở dữ liệu được đặt có độ lớn 255 ký tự, lý do truyền thống / lịch sử là gì? Tôi cho rằng đó là một cái gì đó để làm với giới hạn phân trang / bộ nhớ và hiệu suất nhưng sự khác biệt giữa 255 và 256 luôn làm tôi bối rối.

varchar(255)

Xem xét đây là một công suất hoặc cường độ, không phải là một bộ chỉ mục , tại sao 255 được ưa thích hơn 256? Là một byte dành riêng cho một số mục đích (terminator hoặc null hoặc một cái gì đó)?

Có lẽ varchar (0) là vô nghĩa (có công suất bằng 0)? Trong trường hợp nào 2 ^ 8 không gian nên là 256 chắc chắn?

Có những cường độ khác cung cấp lợi ích hiệu suất? Ví dụ, varchar (512) ít hiệu suất hơn varchar (511) hay varchar (510)?

Là giá trị này giống nhau cho tất cả các cơ sở dữ liệu quan hệ, cũ và mới?

từ chối trách nhiệm - Tôi là nhà phát triển không phải là DBA, tôi sử dụng kích thước và loại trường phù hợp với logic kinh doanh của mình ở nơi được biết đến, nhưng tôi muốn biết lý do lịch sử cho sở thích này, ngay cả khi nó không còn phù hợp (nhưng thậm chí nhiều hơn nếu nó vẫn còn liên quan).

Biên tập:

Cảm ơn câu trả lời, dường như có một số sự đồng thuận rằng một byte được sử dụng để lưu trữ kích thước, nhưng điều này không giải quyết vấn đề dứt khoát trong tâm trí của tôi.

Nếu dữ liệu meta (độ dài chuỗi) được lưu trữ trong cùng bộ nhớ / đĩa liền kề, nó có ý nghĩa. 1 byte siêu dữ liệu và 255 byte dữ liệu chuỗi, sẽ rất phù hợp với nhau và phù hợp với 256 byte lưu trữ liền kề, có lẽ là gọn gàng và ngăn nắp.

Nhưng ... Nếu siêu dữ liệu (độ dài chuỗi) được lưu trữ tách biệt với dữ liệu chuỗi thực tế (có thể trong bảng chính), thì để hạn chế độ dài của dữ liệu chuỗi bằng một byte, chỉ vì việc lưu trữ chỉ một số nguyên 1 byte dễ dàng hơn của siêu dữ liệu có vẻ hơi kỳ lạ.

Trong cả hai trường hợp, nó dường như là một sự tinh tế có lẽ phụ thuộc vào việc thực hiện DB. Việc sử dụng 255 có vẻ khá phổ biến, vì vậy ai đó ở đâu đó đã tranh luận một trường hợp tốt cho nó ngay từ đầu, có ai có thể nhớ trường hợp đó là / là gì không? Các lập trình viên sẽ không áp dụng bất kỳ thực hành mới nào mà không có lý do, và điều này phải là mới một lần.


3
Bởi vì số lượng ký tự bắt đầu từ 0 đến N-1. Vì vậy, 256 ký tự sẽ được khai báo varchar (255). Trừ khi tôi nhầm.
Buhake Sindi

3
Có lẽ bởi vì dân IT bắt đầu đếm bằng 0 chứ không phải 1;)?
Romain Linsolas

Tôi nghĩ rằng nó phải làm với các lập trình viên trường học cũ, thậm chí không thể nhớ tại sao chúng ta đã làm điều đó.
Grumpy

7
@Elite Gent Quý ông: không có số trong ngoặc là độ dài thực ... Giống như trong khai báo mảng C: x [256] cho x [0] ... x [255].
RedPandaCurios

@romaintaz - nhưng hãy xem xét một mảng có thể lưu trữ 1 mục. Bạn khai báo nó một cái gì đó [1] và truy cập nó một cái gì đó [0]. Câu hỏi đặt ra là tại sao trong SQL, chúng ta tuyên bố dung lượng nhỏ hơn 1 byte so với cái nhìn đầu tiên.
Andrew M

Câu trả lời:


167

Với độ dài tối đa 255 ký tự, DBMS có thể chọn sử dụng một byte đơn để chỉ ra độ dài của dữ liệu trong trường. Nếu giới hạn là 256 hoặc lớn hơn, sẽ cần hai byte.

Giá trị độ dài bằng 0 chắc chắn là hợp lệ cho varchardữ liệu (trừ khi bị ràng buộc khác). Hầu hết các hệ thống coi một chuỗi rỗng như vậy khác với NULL, nhưng một số hệ thống (đáng chú ý là Oracle) xử lý một chuỗi trống giống hệt với NULL. Đối với các hệ thống mà chuỗi rỗng không phải là NULL, sẽ cần thêm một bit ở đâu đó trong hàng để cho biết giá trị có nên được coi là NULL hay không.

Như bạn lưu ý, đây là một tối ưu hóa lịch sử và có lẽ không liên quan đến hầu hết các hệ thống hiện nay.


Dành một byte cho độ dài có ý nghĩa, nhưng WRT paragrph thứ hai của bạn, có lẽ a / value / of length zero là hợp lệ, nhưng a / dung lượng / độ dài bằng 0 có hợp lệ không?
Andrew M

1
@Andrew: Tôi vừa thử và PostgreSQL từ chối varchar(0). Nó có thể không hữu ích vì giá trị chỉ có thể là hai thứ, chuỗi rỗng hoặc NULL, và vì vậy bạn cũng có thể sử dụng một giá bittrị đó.
Greg Hewgill

Vì vậy, có đúng không khi cho rằng siêu dữ liệu dung lượng được lưu trữ trong cùng một khối liền kề với chính dữ liệu và do đó, có một lợi thế cho DB để giữ tổng số hai điều đó (dữ liệu và siêu dữ liệu) trong một trang (có lẽ là 256 byte)?
Andrew M

@Andrew: Đó là một giả định có thể đúng hoặc không đúng, tùy thuộc vào chi tiết triển khai của DBMS được đề cập. Kích thước trang thường lớn hơn 256 byte. Như tôi đã đề cập, loại tối ưu hóa này đôi khi rất quan trọng (ví dụ: nếu bạn đang lưu trữ hàng tỷ hàng nhỏ), nhưng hầu hết thời gian không đáng lo ngại.
Greg Hewgill

3
Tầm quan trọng trong không gian đĩa (và không gian chỉ mục) không phải vì 256 có thể vừa trong một trang mà vì 1 byte so với 2 byte (đối với hàng triệu / tỷ tỷ hàng nghìn tỷ) tạo ra sự khác biệt lớn.
ypercubeᵀᴹ

35

255 là giới hạn varchar trong myQuery4 trở về trước.

Ngoài ra 255 ký tự + dấu chấm hết Null = 256

Hoặc bộ mô tả độ dài 1 byte cung cấp phạm vi có thể 0-255 ký tự


Và đọc vào char foo[256]là rất quan trọng vì quản lý bộ nhớ thích các quyền hạn của 2. xem: stackoverflow.com/questions/3190146/ Nhật Bản Phân bổ char foo[257]sẽ phân đoạn bộ nhớ hoặc chiếm 512 byte.
ebyrob

4
Không varchar lưu trữ độ dài của chuỗi, và do đó không cần một bộ kết thúc null?
Cruncher

19

255 là giá trị số lớn nhất có thể được lưu trữ trong một số nguyên không dấu một byte (giả sử byte 8 bit) - do đó, các ứng dụng lưu trữ độ dài của chuỗi cho mục đích nào đó sẽ thích 255 hơn 256 vì điều đó có nghĩa là chúng chỉ phải cấp phát 1 byte cho biến "size".


17

Từ hướng dẫn sử dụng MySQL:

Kiểu dữ liệu:
VARCHAR (M), VARBINARY (M)

Yêu cầu lưu trữ:
L + 1 byte nếu giá trị cột yêu cầu 0 - 255 byte, L + 2 byte nếu giá trị có thể yêu cầu nhiều hơn 255 byte

Hiểu và đưa ra lựa chọn.


Có, nhưng M represents the declared column length in characters for nonbinary string types and bytes for binary string types. L represents the actual length in bytes of a given string value. dev.mysql.com/doc/refman/5.7/en/st Storage
request.html


7

Độ dài tối đa 255 cho phép công cụ cơ sở dữ liệu chỉ sử dụng 1 byte để lưu trữ độ dài của mỗi trường. Bạn đúng rằng 1 byte không gian cho phép bạn lưu trữ 2 ^ 8 = 256 giá trị riêng biệt cho độ dài của chuỗi.

Nhưng nếu bạn cho phép trường lưu trữ các chuỗi văn bản có độ dài bằng không, bạn cần có khả năng lưu trữ số không theo chiều dài. Vì vậy, bạn có thể cho phép 256 giá trị độ dài riêng biệt, bắt đầu từ 0: 0-255.


6

Thông thường các varchars được triển khai dưới dạng chuỗi pascal: giữ độ dài thực tế trong byte # 0. Do đó, độ dài bị ràng buộc là 255. (Giá trị của một byte thay đổi từ 0 đến 255.)


5

<<

Nhớ lại các nguyên tắc cơ bản của lưu trữ bit / byte, nó yêu cầu một byte để lưu trữ số nguyên dưới 256 và hai byte cho bất kỳ số nguyên nào giữa 256 và 65536. Do đó, nó yêu cầu cùng một không gian (hai byte) để lưu trữ 511 hoặc 512 hoặc cho vấn đề đó 65535 .... Vì vậy, rõ ràng là đối số được đề cập trong cuộc thảo luận ở trên là N / A cho varchar (512) hoặc varchar (511).


4

8 bit không dấu = 256 byte

255 ký tự + byte 0 cho độ dài


3

Nó được sử dụng là tất cả các chuỗi yêu cầu một bộ kết thúc NUL hoặc "dấu gạch chéo ngược". Cơ sở dữ liệu cập nhật không có điều đó. Đó là "255 ký tự văn bản" với "\ 0" được thêm tự động vào cuối để hệ thống biết chuỗi kết thúc ở đâu. Nếu bạn nói VARCHAR (256), cuối cùng nó sẽ là 257 và sau đó bạn sẽ đăng ký tiếp theo cho một ký tự. Lãng phí. Đó là lý do tại sao mọi thứ là VARCHAR (255) và VARCHAR (31). Theo thói quen, 255 dường như bị mắc kẹt xung quanh nhưng những người 31 trở thành 32 và 511 trở thành 512. Phần đó thật kỳ lạ. Thật khó để khiến tôi viết VARCHAR (256).


0

Tôi nghĩ rằng điều này có thể trả lời câu hỏi của bạn. Có vẻ như đó là giới hạn tối đa của varchar trong các hệ thống trước đó. Tôi lấy nó ra một câu hỏi stackoverflow khác.

Tất nhiên, thật khó để biết địa chỉ bưu chính dài nhất là gì, đó là lý do tại sao nhiều người chọn một VARCHAR dài chắc chắn dài hơn bất kỳ địa chỉ nào. Và 255 là thông lệ vì nó có thể là độ dài tối đa của VARCHAR trong một số cơ sở dữ liệu vào thời điểm bình minh (cũng như PostgreQuery cho đến gần đây).

Có bất lợi nào khi sử dụng một varchar chung (255) cho tất cả các trường dựa trên văn bản không?


0

Dữ liệu được lưu trong bộ nhớ trong hệ thống nhị phân và 0 và 1 là các chữ số nhị phân. Số nhị phân lớn nhất có thể vừa với 1 byte (8 bit) là 11111111 chuyển thành số thập phân 255.

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.