Qual è il modo canonico per archiviare testo arbitrario (possibilmente contrassegnato) in SQL?

StackOverflow https://stackoverflow.com/questions/95459

  •  01-07-2019
  •  | 
  •  

Domanda

Cosa fanno wiki/stackoverflow/ecc.fare quando si tratta di memorizzare testo?Il testo è interrotto nei ritorni a capo?È suddiviso in blocchi di lunghezza fissa?Come archiviare al meglio porzioni di testo arbitrariamente lunghe?

È stato utile?

Soluzione

nvarchar(max) ftw.perché complicare troppo le cose semplici è sbagliato, ok?

Altri suggerimenti

Immagino che se devi offrire la possibilità di archiviare grandi porzioni di testo e non ti dispiace non poter esaminare troppo il loro contenuto durante le query, puoi utilizzare CLobs.

Tutto dipende dall'RDBMS che stai utilizzando e dai tipi di testo che memorizzerai.Se il testo è formattato in porzioni considerevoli di dati che significano qualcosa di per sé, ad esempio intestazione/corpo, allora potresti voler suddividere i dati in colonne di questi tipi.Potrebbero essere necessarie più tabelle per utilizzare questo metodo a seconda del contenuto con cui hai a che fare.

Non so come lo gestiscono gli altri RDBMS, ma so che non è una buona idea avere più di una colonna aperta in ciascuna tabella (testo o varchar(max)).Quindi dovrai assicurarti che solo una colonna abbia caratteri illimitati.

Per quanto riguarda PostgreSQL: usa il tipo TESTO O BYTEA.Se hai bisogno di leggere pezzi casuali, potresti prendere in considerazione oggetti di grandi dimensioni.

Se devi preoccuparti di mantenere elementi come stringhe di formattazione, virgolette e altri "cruft" nel testo, come probabilmente farebbe il codice, allora i caratteri speciali devono essere prima completamente sfuggiti, altrimenti all'invio del db, potrebbero finire causando l'emissione di un comando non valido.

La maggior parte dei linguaggi di scripting dispone di strumenti per eseguire questa operazione integrati in modo nativo.

Immagino che dipenda da dove vuoi archiviare il testo, se hai bisogno di cose come transazioni, ecc.

I database come SQL Server hanno un tipo in grado di memorizzare campi di testo lunghi.In SQL Server 2005 sarebbe principalmente nvarchar(max) per stringhe di testo Unicode lunghe.Utilizzando un database puoi trarre vantaggio dalle transazioni e da un facile backup/ripristino supponendo che tu stia utilizzando il database per altre cose come fa StackOverflow.com.

L'alternativa è archiviare il testo in file su disco.Questo può essere abbastanza semplice da implementare e può funzionare in ambienti in cui un database non è disponibile o è eccessivo.

Per quanto riguarda il formato del testo memorizzato in un database o in un file, probabilmente è molto vicino a quello dell'input.Se è HTML, lo inseriresti semplicemente attraverso una funzione che gli sfuggirebbe correttamente.

Qualcosa da ricordare è che probabilmente vorrai utilizzare Unicode o UTF-8 dalla creazione all'archiviazione e viceversa.Ciò ti consentirà di supportare lingue aggiuntive.Qualsiasi problema con questo meccanismo di codifica corromperà il tuo testo.Storicamente le persone potrebbero aver utilizzato ASCII per impostazione predefinita in base al presupposto che stavano risparmiando spazio su disco, ecc.

Per SQLServer:

Utilizzare un varchar(max) per archiviare.Penso che il limite superiore sia 2 GB.

Non cercare di sfuggire al testo da solo.Passa il testo attraverso una struttura di parametrizzazione che eseguirà correttamente le fughe per te.In .Net dovresti aggiungere un parametro a SqlCommand o semplicemente utilizzare LinqToSQL (che quindi gestisce SqlCommand per te).

Sospetto che StackOverflow memorizzi il testo in formato markdown in una colonna "testo" di dimensioni arbitrarie.Forse come UTF8 (ma potrebbe essere UTF16 o qualcosa del genere.Immagino che sia SQL Server, di cui non so molto).

Come regola generale, vuoi archiviare le cose nel tuo database nella forma "più grezza" possibile.Cioè, esegui tutta la decodifica e possibilmente la pulizia, ma non fare nient'altro con esso (ad esempio, se è Markdown, non codificarlo in HTML, lascialo nel suo formato "grezzo" originale)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top