Perché storicamente le persone usano 255 non 256 per le dimensioni dei campi del database?


190

Spesso vedi i campi del database impostati per avere una grandezza di 255 caratteri, qual è il motivo storico / tradizionale perché? Presumo che abbia a che fare con limiti di paging / memoria e prestazioni, ma la distinzione tra 255 e 256 mi ha sempre confuso.

varchar(255)

Considerando che si tratta di una capacità o di una grandezza, non di un indicizzatore , perché 255 è preferito su 256? Un byte è riservato per qualche scopo (terminatore o null o qualcosa del genere)?

Presumibilmente varchar (0) è un'assurdità (ha capacità zero)? In tal caso 2 ^ 8 di spazio dovrebbe essere sicuramente 256?

Ci sono altre dimensioni che offrono vantaggi in termini di prestazioni? Ad esempio varchar (512) è meno performante di varchar (511) o varchar (510)?

Questo valore è lo stesso per tutti i database delle relazioni, vecchi e nuovi?

disclaimer - Sono uno sviluppatore, non un DBA, utilizzo dimensioni e tipi di campi che si adattano alla mia logica aziendale laddove è noto, ma mi piacerebbe conoscere il motivo storico di questa preferenza, anche se non è più pertinente (ma anche più se è ancora rilevante).

Modificare:

Grazie per le risposte, sembra esserci un certo consenso sul fatto che un byte viene utilizzato per memorizzare le dimensioni, ma questo non risolve definitivamente la questione nella mia mente.

Se i metadati (lunghezza stringa) sono memorizzati nella stessa memoria / disco contigui, ha un senso. 1 byte di metadati e 255 byte di dati stringa, si adatterebbero perfettamente l'un l'altro e si inserirebbero in 256 byte contigui di memoria, che presumibilmente è pulito e ordinato.

Ma ... Se i metadati (lunghezza della stringa) sono memorizzati separatamente dai dati della stringa effettiva (forse in una tabella principale), allora per limitare la lunghezza dei dati della stringa di un byte, solo perché è più facile memorizzare solo un numero intero di 1 byte dei metadati sembra un po 'strano.

In entrambi i casi, sembrerebbe una sottigliezza che probabilmente dipende dall'implementazione del DB. La pratica dell'uso di 255 sembra piuttosto diffusa, quindi qualcuno da qualche parte deve aver discusso un buon caso all'inizio, qualcuno può ricordare quale fosse / è quel caso? I programmatori non adotteranno alcuna nuova pratica senza una ragione, e questa deve essere stata una volta nuova.


3
Poiché il conteggio dei caratteri inizia da 0 a N-1. Quindi 256 caratteri saranno dichiarati varchar (255). A meno che non mi sbagli.
Buhake Sindi,

3
Forse perché le persone IT iniziano a contare con 0, non 1;)?
Romain Linsolas,

Penso che abbia a che fare con i programmatori della vecchia scuola, non riesco nemmeno a ricordare perché l'abbiamo fatto.
Scontroso

7
@Elite Gentleman: no, il numero tra parentesi è la vera lunghezza ... Come nelle dichiarazioni di array C: x [256] dà x [0] ... x [255].
RedPandaCurios,

@romaintaz - ma considera un array che può contenere 1 oggetto. Lo dichiari qualcosa [1] e accedi a qualcosa [0]. La domanda è perché in SQL dichiariamo la capacità di 1 byte in meno di quanto sembri logico a prima vista.
Andrew M,

Risposte:


167

Con una lunghezza massima di 255 caratteri, il DBMS può scegliere di utilizzare un singolo byte per indicare la lunghezza dei dati nel campo. Se il limite fosse 256 o maggiore, sarebbero necessari due byte.

Un valore di lunghezza zero è sicuramente valido per i varchardati (se non vincolato diversamente). La maggior parte dei sistemi considera una stringa così vuota distinta da NULL, ma alcuni sistemi (in particolare Oracle) trattano una stringa vuota in modo identico a NULL. Per i sistemi in cui una stringa vuota non è NULL, sarebbe necessario un bit aggiuntivo da qualche parte nella riga per indicare se il valore deve essere considerato NULL o meno.

Come notate, questa è un'ottimizzazione storica e probabilmente non è rilevante per la maggior parte dei sistemi oggi.


Riservare un byte per la lunghezza ha senso, ma WRT il tuo secondo paragramma, presumibilmente un / valore / di lunghezza zero è valido, ma è valido un / capacità / di lunghezza zero?
Andrew M,

1
@Andrew: ho appena provato e PostgreSQL rifiuta varchar(0). Probabilmente non è così utile perché il valore potrebbe essere solo due cose, la stringa vuota o NULL, e quindi potresti anche usare a bitper quello.
Greg Hewgill,

Quindi è vero supporre che i metadati di capacità siano memorizzati nello stesso blocco contiguo dei dati stessi, e quindi c'è un vantaggio per il DB di mantenere il totale di queste due cose (dati e metadati) all'interno di una pagina (presumibilmente 256 byte)?
Andrew M,

@Andrew: questo è un presupposto che può essere o non essere vero, a seconda dei dettagli di implementazione del DBMS in questione. Le dimensioni della pagina sono in genere molto più grandi di 256 byte. Come ho già detto, questo tipo di ottimizzazione a volte è importante (ad es. Se si memorizzano miliardi di piccole file), ma la maggior parte delle volte non vale la pena preoccuparsi.
Greg Hewgill,

3
L'importanza dello spazio su disco (e dello spazio dell'indice) non è perché 256 possono rientrare in una pagina ma perché 1 byte contro 2 byte (per milioni / miliardi / trilioni di righe) fa una grande differenza.
ypercubeᵀᴹ

35

255 era il limite varchar in mySQL4 e precedenti.

Anche 255 caratteri + Null terminator = 256

Oppure un descrittore di lunghezza di 1 byte fornisce un intervallo possibile 0-255 caratteri


E la lettura in char foo[256]è importante perché alla gestione della memoria piacciono i poteri di 2. vedi: stackoverflow.com/questions/3190146/… L' allocazione char foo[257]frammenterà la memoria o occuperà 512 byte.
ebyrob il

4
Varchar non memorizza la lunghezza della stringa e quindi non ha bisogno di un terminatore null?
Cruncher,

19

255 è il valore numerico più grande che può essere memorizzato in un intero senza segno a byte singolo (assumendo byte a 8 bit) - quindi, le applicazioni che memorizzano la lunghezza di una stringa per qualche scopo preferirebbero 255 a 256 perché significa che devono solo allocare 1 byte per la variabile "size".


17

Dal manuale di MySQL:

Tipo di dati:
VARCHAR (M), VARBINARY (M)

Memoria richiesta:
L + 1 byte se i valori di colonna richiedono 0 - 255 byte, L + 2 byte se i valori possono richiedere più di 255 byte

Comprendi e fai la scelta.


Sì, ma 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/storage-requirements.html
DLight


7

Una lunghezza massima di 255 consente al motore di database di utilizzare solo 1 byte per memorizzare la lunghezza di ciascun campo. È corretto che 1 byte di spazio consente di memorizzare 2 ^ 8 = 256 valori distinti per la lunghezza della stringa.

Ma se si consente al campo di memorizzare stringhe di testo di lunghezza zero, è necessario essere in grado di memorizzare zero nella lunghezza. Quindi puoi consentire 256 valori di lunghezza distinti, iniziando da zero: 0-255.


6

Spesso i varchar sono implementati come stringhe pascal: mantenendo la lunghezza effettiva nel byte # 0. La lunghezza era quindi legata a 255. (Il valore di un byte varia da 0 a 255.)


5

<<

Ricordo i fondamenti della memorizzazione di bit / byte, richiede un byte per memorizzare numeri interi inferiori a 256 e due byte per qualsiasi numero intero compreso tra 256 e 65536. Quindi, richiede lo stesso spazio (due byte) per memorizzare 511 o 512 o per tale motivo 65535 .... Quindi è chiaro che questo argomento menzionato nella discussione sopra è N / A per varchar (512) o varchar (511).


4

8 bit senza segno = 256 byte

255 caratteri + byte 0 per lunghezza


3

In passato tutte le stringhe richiedevano un terminatore NUL o "backslash-zero". I database aggiornati non lo hanno. Erano "255 caratteri di testo" con uno "\ 0" aggiunto automaticamente alla fine in modo che il sistema sapesse dove finiva la stringa. Se dicessi VARCHAR (256), finirà per essere 257 e quindi saresti nel registro successivo per un personaggio. Uno spreco. Ecco perché tutto era VARCHAR (255) e VARCHAR (31). Per abitudine il 255 sembra essersi bloccato, ma gli anni 31 sono diventati 32 e i 511 sono diventati 512. Quella parte è strana. È difficile farmi scrivere VARCHAR (256).


0

Penso che questo potrebbe rispondere alla tua domanda. Sembra che fosse il limite massimo di varchar nei sistemi precedenti. L'ho tolto da un'altra domanda di StackOverflow.

È difficile sapere qual è l'indirizzo postale più lungo, ovviamente, motivo per cui molte persone scelgono un VARCHAR lungo che è sicuramente più lungo di qualsiasi indirizzo. E 255 è consuetudine perché potrebbe essere stata la lunghezza massima di un VARCHAR in alcuni database agli albori dei tempi (così come PostgreSQL fino a poco tempo fa).

Ci sono svantaggi nell'utilizzo di un varchar generico (255) per tutti i campi basati su testo?


0

I dati vengono salvati in memoria nel sistema binario e 0 e 1 sono cifre binarie. Il numero binario più grande che può contenere 1 byte (8 bit) è 11111111 che converte in 255 decimali.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.