Qual é a forma canônica para armazenar (possivelmente marcado) texto arbitrário no SQL?

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

  •  01-07-2019
  •  | 
  •  

Pergunta

O que fazer wikis / stackoverflow / etc. fazer quando se trata de armazenar o texto? É o texto quebrado em novas linhas? É quebrado em pedaços de comprimento fixo? Como você melhor loja arbitrariamente longos pedaços de texto?

Foi útil?

Solução

nvarchar (max) ftw. porque mais de complicar as coisas simples é ruim, mmkay?

Outras dicas

Eu acho que se você precisa oferecer a capacidade de armazenar grandes pedaços de texto e você não se importa de não ser capaz de olhar para o seu conteúdo muito ao consultar, você pode usar CLOBs.

Isso tudo depende do RDBMS que você está usando, bem como os tipos de texto que você está indo para armazenar. Se o texto é formatado em pedaços consideráveis ??de dados que significam algo em si, como, digamos cabeçalho / corpo, então você pode querer quebrar a dados até em colunas desses tipos. Pode levar várias tabelas para usar este método, dependendo do conteúdo que você está lidando.

Eu não sei como alça de outras RDBMS, mas eu sei que isso não é uma boa idéia ter mais de uma coluna em aberto em cada tabela (texto ou varchar (max)). Então você vai querer se certificar de que apenas uma coluna tem caracteres ilimitados.

Em relação PostgreSQL - Tipo de uso TEXT ou BYTEA . Se você precisa ler pedaços aleatórios você pode considerar objetos grandes .

Se precisar de se preocupar em manter as coisas como cordas de formatação, citações, e outros "cruft" no texto, como código provavelmente teria, em seguida, os caracteres especiais precisam ser completamente escapou primeira - caso contrário, mediante a apresentação do db, eles pode acabar causando um comando inválido para ser emitido.

A maioria das linguagens de script tem ferramentas para fazer isso built-in de forma nativa.

Eu acho que depende de onde você deseja armazenar o texto, se você precisar de coisas como transações etc.

Os bancos de dados como SQL Server tem um tipo que pode armazenar campos de texto longo. Em SQL Server 2005, esta seria principalmente nvarchar (max) para cadeias de texto longo unicode. Usando um banco de dados que você pode se beneficiar de transações e fácil de backup / restauração supondo que você está usando o banco de dados para outras coisas como StackOverflow.com faz.

A alternativa é armazenar texto em arquivos no disco. Isso pode ser bastante simples de implementar e pode trabalhar em ambientes onde um banco de dados não está disponível ou um exagero.

Considera que o formato do texto que é armazenado em um banco de dados ou arquivo, ele é provavelmente muito perto da entrada. Se for HTML, então você poderia apenas empurrar-lo através de uma função que seria corretamente escapar.

Algo para se lembrar é que você provavelmente vai querer estar usando Unicode ou UTF-8 desde a criação até o armazenamento e vice-versa. Isso permitirá que você para suportar idiomas adicionais. Qualquer problema com este mecanismo de codificação irá corromper seu texto. Historicamente pessoas podem ter padrão para ASCII baseado na suposição de que eles estavam economizando espaço em disco etc.

Para o SQL Server:

Use um varchar (max) para armazenar. Eu acho que o limite superior é de 2 GB.

Não tente escapar o texto você mesmo. Passe o texto através de uma estrutura de parametrização que vai fazer os escapes corretamente para você. Em .Net você adicionar um parâmetro para um SqlCommand, ou simplesmente usar LinqToSQL (que, em seguida, gere o SqlCommand para você).

Eu suspeito StackOverflow está armazenando texto em formato de remarcação em 'texto' arbitrariamente porte coluna. Talvez como UTF8 (mas pode ser UTF16 ou algo assim. Eu estou supondo que é SQL Server, que eu não sei muito sobre).

Como regra geral você quer coisas armazenar em seu banco de dados na forma 'mais crua' possível. Isto é, fazer todas as suas decodificação e, possivelmente, a limpeza, mas não fazer qualquer outra coisa com ele (por exemplo, se é Markdown, não codificá-lo para HTML, deixá-lo em seu formato original 'raw')

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top