Каков канонический способ хранения произвольного (возможно, размеченного) текста в SQL?

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

  •  01-07-2019
  •  | 
  •  

Вопрос

Что делают wikis /stackoverflow / etc.что делать, когда дело доходит до хранения текста?Текст разбит на новые строки?Разбит ли он на куски фиксированной длины?Как вам лучше всего хранить произвольно длинные фрагменты текста?

Это было полезно?

Решение

наварчар (макс) ftw.потому что чрезмерно усложнять простые вещи - это плохо, понимаешь?

Другие советы

Я думаю, если вам нужно предложить возможность хранения больших фрагментов текста, и вы не возражаете против того, что не можете слишком внимательно изучать их содержимое при выполнении запросов, вы можете использовать CLOBs .

Все это зависит от используемой вами СУБД, а также от типов текста, который вы собираетесь хранить.Если текст отформатирован в виде значительных фрагментов данных, которые что-то значат сами по себе, например, заголовок / тело, то вы можете захотеть разбить данные на столбцы этих типов.Для использования этого метода может потребоваться несколько таблиц, в зависимости от содержимого, с которым вы имеете дело.

Я не знаю, как с этим справляются другие СУБД, но я знаю, что не очень хорошая идея иметь более одного открытого столбца в каждой таблице (text или varchar (max)).Поэтому вам нужно будет убедиться, что только один столбец содержит неограниченное количество символов.

Что касается PostgreSQL - тип использования ТЕКСТ или БЫТИЕ.Если вам нужно прочитать случайные фрагменты, вы можете рассмотреть крупные объекты.

Если вам нужно беспокоиться о сохранении таких вещей, как форматирование строк, кавычек и прочего "мусора" в тексте, как это, вероятно, было бы в коде, тогда специальные символы сначала должны быть полностью экранированы - в противном случае при отправке базы данных они могут в конечном итоге привести к выдаче недопустимой команды.

В большинстве скриптовых языков изначально встроены инструменты для этого.

Я думаю, это зависит от того, где вы хотите сохранить текст, нужны ли вам такие вещи, как транзакции и т.д.

Базы данных, такие как SQL Server, имеют тип, который может хранить длинные текстовые поля.В SQL Server 2005 это в первую очередь был бы nvarchar (max) для длинных текстовых строк в юникоде.Используя базу данных, вы можете извлечь выгоду из транзакций и простого резервного копирования / восстановления, предполагая, что вы используете базу данных для других целей, таких как StackOverflow.com does.

Альтернативой является хранение текста в файлах на диске.Это может быть довольно просто реализовать и работать в средах, где база данных недоступна или перегружена.

Что касается формата текста, который хранится в базе данных или файле, то он, вероятно, очень близок к входному.Если это HTML, то вы бы просто пропустили его через функцию, которая бы корректно экранировала его.

Следует помнить, что вы, вероятно, захотите использовать unicode или UTF-8 от создания до хранения и наоборот.Это позволит вам поддерживать дополнительные языки.Любая проблема с этим механизмом кодирования приведет к повреждению вашего текста.Исторически люди, возможно, по умолчанию использовали ASCII, исходя из предположения, что они экономят место на диске и т.д.

Для SQL Server:

Используйте varchar(максимум) для хранения.Я думаю, что верхний предел составляет 2 ГБ.

Не пытайтесь сами сбежать от текста.Передайте текст через параметризующую структуру, которая будет выполнять экранирование должным образом за вас.В .Net вы бы добавили параметр в SqlCommand или просто использовали LinqToSql (который затем управляет SqlCommand за вас).

Я подозреваю, что StackOverflow хранит текст в формате markdown в столбце "текст" произвольного размера.Может быть, как UTF8 (но это может быть UTF16 или что-то в этом роде.Я предполагаю, что это SQL Server, о котором я мало что знаю).

Как правило, вы хотите хранить данные в своей базе данных в как можно более "сыром" виде.То есть, выполните все свое декодирование и, возможно, очистку, но больше ничего с ним не делайте (например, если это Markdown, не кодируйте его в HTML, оставьте в исходном формате raw)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top