C'è qualche motivo per usare varchar su colonne di testo in un database?


36

È arrivato varcharsolo un residuo di prima texto ci sono casi d'uso in cui vorresti usare un varchar? (O del charresto ..)

(Uso Postgres e MySQL (MyISAM) ogni giorno, quindi quelli sono ciò che mi interessa di più, ma le risposte per altri database sono ovviamente benvenute. ^ _-)


6
Almeno per SQL Server , textè obsoleto. Vi sono inoltre considerazioni sull'utilizzo correlate alla posizione in cui sono archiviati i dati e al modo in cui vengono quindi raggiunti.
Oded,

Su alcuni DBMS potresti non essere in grado di utilizzare una colonna di testo in una clausola sort o where. Non ho familiarità con Postgres ma controlla la tua documentazione.
jqa,

1
Questa domanda StackOverflow potrebbe fornire qualche informazione in più.
J0ANMM,

Risposte:


32

In generale

textle colonne non sono standard e sono specifiche per l'implementazione. In molti casi, a seconda del database, possono avere una combinazione di una o più delle seguenti restrizioni: non indicizzabili , non ricercabili e non ordinabili .

In Postgres

Tutti questi tipi vengono salvati internamente utilizzando la stessa struttura di dati C. .

In MySQL

La textcolonna è una versione specializzata diBLOB e presenta restrizioni sull'indicizzazione.

Solo questi due esempi possono essere estrapolati agli altri sistemi SQL RDBMS e dovrebbero essere una ragione sufficiente per capire quando scegliere un tipo rispetto all'altro.

Giusto per renderlo implicitamente chiaro, non dovresti mai usarlo TEXTin quanto proprietario e non standard. Qualunque cosa SQLtu scriva contro di essa non sarà portatile e ti garantirà problemi in futuro. Utilizzare solo tipi che fanno parte dello standard ANSI .

  • Utilizzare CHARquando si sa di avere un numero fisso di caratteri per ogni voce.
  • Utilizzare VARCHARquando si dispone di un numero variabile di caratteri per ogni voce.
  • Se hai bisogno di più spazio di archiviazione di quello che VARCHARpuò fornire, CLOBcon UTF-8codifica o tipo standard equivalente.
  • MAI utilizzare in TEXTquanto non è standard.

1
Accettato per non standard and implementation specifice not indexable, not searchable and not sortable, che non avevo realizzato. Avevo l'impressione che text fosse standardizzato.
Izkata,

1
intendi lo textstandard ASCII o lo textstandard UNICODE :-) o una delle altre mezza dozzina di textstandard di codifica?

1
se vai a scavare tra i documenti degli standard SQL, non credo che troverai qualcosa textcome tipo di carattere. Non ho visto nulla, alcuni venditori lo chiamano long chare simili, è fondamentalmente un BLOB con una codifica allegata.

2
@JarrodRoberson a dire il vero ci sono molte risorse affidabili che concludono (quando si trovano nell'ambiente Postgres) che "usano sempre TEXT". Se hai intenzione di migrare su un database diverso, non è certo un rompicapo, soprattutto perché dovrai considerare che il numero illimitato VARCHARdi Postgres (a causa di TOAST non ha limiti di riga come ad esempio con MySQL) potrebbe non tradursi in illimitato VARCHARin altri database comunque.
Kayaman,

1
... e poiché Postgres non supporta CLOB , il penultimo punto non vale. Non sarai mai in grado di supportare sostituzioni drop-in anche se aderisci allo standard. Oltre a scrivere ANSI SQL non è un'opzione praticabile nel mondo reale, a meno che tu non stia scrivendo SQL giocattolo.
Kayaman,

11

text, varcharE charsono tutti utilizzati per motivi diversi. Ci sono ovviamente differenze di implementazione (quante dimensioni occupano ... ecc.), Ma ci sono anche considerazioni sull'uso e sull'intento . Il tipo che usi ti dice anche qualcosa sul tipo di dati che verranno archiviati al suo interno (o che tutti useremmo textper tutto ). Se qualcosa ha una lunghezza fissa, usiamo char. Se ha una lunghezza variabile con un limite superiore ben definito, utilizzare varchar. Se è un grosso pezzo di testo su cui hai poco controllo, textprobabilmente sarebbe la soluzione migliore.


3
Quindi, l'unica vera differenza è duplicare il controllo dei limiti che probabilmente dovrebbe essere nel codice del programma?
Izkata,

2
@Izkata - Ci sono anche differenze di implementazione. Non si tratta del controllo dei limiti, si tratta del tipo di dati . Un codice postale (US) è ​​sempre un codice di 5 cifre, quindi l'uso di qualcosa come "char" diventa parte della definizione di questo dato. Se si trattasse solo di cose come il controllo associato, potremmo tutti usare un solo tipo di dati per tutto e fare il nostro lato di controllo e casting.
System Down

6
@SystemDown quanto ne so, char, varchar, e textsono tutti progettati per memorizzare lo stesso tipo di dati. Quindi entrambe le risposte qui riguardano il controllo dei limiti. Se ci sono differenze di efficienza, quali sono? Perché utilizzare varcharsopra text?
Izkata,

1
float e double vengono anche utilizzati per lo stesso tipo di dati, tuttavia presentano differenze e vengono utilizzati in modo diverso. Per quanto riguarda le differenze di implementazione, non conosco abbastanza Postgres per rispondere che temo.
System Down

4
@SystemDown Anche se l'archiviazione di codici postali come carattere (5) potrebbe morderti se inizi a internazionalizzare. I codici postali britannici variano in lunghezza e 5 caratteri non sono quasi mai abbastanza. Tuttavia, non so se lo spazio in un codice postale del Regno Unito sia rilevante per l'analisi.
Vatine,

5

I database sono fortemente interessati alle prestazioni, alla velocità e alla riduzione al minimo dell'archiviazione. Nella maggior parte delle altre parti del mondo dei computer, non ti preoccuperai di quanti caratteri ci sono nella tua stringa di caratteri; potrebbe essere uno, potrebbe essere l'intero contenuto di un'enciclopedia; è tutto solo una stringa. In effetti, molte lingue non ti danno nemmeno fastidio se si tratta di una stringa o di un numero.

Ma man mano che i computer diventano più veloci e guadagnano più memoria, le persone inseriscono più dati nei loro database e fanno query più elaborate. Per un database la CPU e la memoria oggi sono tanto limitanti quanto lo erano ai tempi della memoria principale a 64 KB e dei dischi rigidi da 10 Mb (sui computer mainframe ).

Un numero fisso di byte è molto più semplice da gestire rispetto a un numero di lunghezza variabile. 10 byte è molto più facile da gestire rispetto a 1.000.000. Quindi il tuo database ti vuole dare un indizio in modo che possa darti un gigabyte di risultati da terrabyte di dati in microsecondi. Se non stai usando il tuo database così duramente, non avrai bisogno della velocità che offre e sarai infastidito dalle domande inutili. Ma se hai bisogno della performance, sarai felice di darti qualche suggerimento.

Come notato nelle altre risposte, usa charse usa sempre un certo numero di caratteri, varcharse la lunghezza può variare ma non diventa troppo grande ( suppongo che la maggior parte dei DB la tratti come una charo in textbase alla dimensione), e textse potrebbe essere di qualsiasi lunghezza. Se il tuo SQL tenta di utilizzare una textcolonna, potrebbe essere meglio riassumerlo in qualche modo e metterlo anche in una charo piccola varcharcolonna, quindi fai wheree basta order by. Certo, questo è solo se la performance è importante per te.

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.