Как я должен сохранить строки краткого текста в базу данных SQL Server?

ConcurrentHashMap или ConcurrentLinkedQueue или ConcurrentSkipListMap может быть другой опцией, потому что они никогда не будут бросать любое ConcurrentModificationException, даже если вы удалите или добавите элемент.

13
задан John Saunders 22 April 2010 в 13:48
поделиться

8 ответов

VARCHAR (255). Это не будет использовать все 255 символов устройства хранения данных, просто устройства хранения данных, в котором Вы нуждаетесь. Это 255 а не 256, потому что тогда у Вас есть пространство для 255 плюс пустой разделитель (или байт размера).

"N" для Unicode. Используйте, если Вы ожидаете символы неASCII.

11
ответ дан 1 December 2019 в 17:59
поделиться

Существует несколько других вопросов для рассмотрения при определении char/varchar и изменения N.

Первый, существуют немного служебные к хранению строк переменной длины в базе данных. Хорошее общее эмпирическое правило состоит в том, чтобы использовать CHAR для строк меньше чем 10 символов в длину, так как N/VARCHAR хранит и строку и длину и различие между хранением короткий , строки в N/CHAR по сравнению с N/VARCHAR под 10 не стоят издержек длины строки.

116-секундный, таблица в SQL-сервере хранится на страницах 8KB, таким образом, макс. размер строки данных составляет 8 060 байтов (другие 192 используются для издержек SQL). Вот почему SQL позволяет макс. определенный столбец VARCHAR (8000) и NVARCHAR (4000). Теперь, Вы можете использование VARCHAR (МАКС) и unicode версия. Но может быть дополнителен служебный связанный с этим.

, Если я не ошибаюсь, SQL-сервер попытается хранить данные на той же странице как остальная часть строки, но, при попытке поместить слишком много данных в VARCHAR (Max) столбец, то это будет рассматривать его как двоичный файл и хранить его на другой странице.

Другая большая разница между CHAR и VARCHAR имеет отношение к расщеплениям страницы. Учитывая, что SQL Server хранит данные на страницах 8KB, у Вас могло быть любое количество строк данных, хранивших на странице. Если Вы ОБНОВЛЕНИЕ столбец VARCHAR со значением, которое является достаточно большим, которому строка больше не будет соответствовать на странице, сервер, будете разделять что страница, отъезжая некоторое количество записей. Если база данных не имеет никаких доступных страниц, и база данных установлена на автоматический, растут, сервер сначала вырастит базу данных для выделения пустых страниц ей, то выделит пустые страницы таблице и наконец разделит единственную страницу на два.

4
ответ дан 1 December 2019 в 17:59
поделиться

В SQL Server MS (7.0 и), varchar данные представлен внутренне максимум с тремя значениями:

  • фактическая строка символов, которые будут от 0 до чего-то более чем 8 000 байтов (it’s на основе размера страницы, другие столбцы, сохраненные для строки и несколько других факторов)
  • Два байта, раньше указывала, какой длины строка данных (который производит значение от 0 до 8 000 +)
  • , Если столбец nullable, один бит в row’s пустой битовой маске (таким образом, пустое состояние до восьми nullable столбцов может быть представлено в одном байте)

, важная часть является тем двухбайтовым индикатором длины данных. Если бы это был один байт, то Вы могли бы только правильно записать строки длины от 0 до 255; с двумя байтами можно записать строки длины 0 к чему-то более чем 64 000 + (а именно, 2^16 - 1). Однако длина страницы SQL Server является 8k, который является, куда это 8000 + символьный предел прибывает из. (Существует материал переполнения данных в SQL 2005, но если Ваши строки будут этим долго, необходимо просто пойти с varchar (макс.).)

Так, неважно, то, сколько времени Вы объявляете, что Ваш столбец типа данных varchar (15, 127, 511), что Вы будете на самом деле хранить для каждой строки:

  • 2 байта для указания, какой длины строка
  • фактическая строка, т.е. количество символов в той строке

, Который получает меня к моей точке: много более старых систем использовали только 1 байт для хранения длины строки, и это ограничило Вас максимальной длиной 255 символов, который isn’t все настолько долго. С 2 байтами у Вас нет такого произвольного предела... и таким образом, я рекомендую выбрать число, которое имеет смысл к (предполагаемый нетехнически ориентированный) пользователь., мне нравится 50, 100, 250, 500, даже 1000. Учитывая, что основа 8 000 + байты устройства хранения данных, 255 или 256 так же эффективна как 200 или 250, и меньше эффективный, когда это прибывает время для объяснения вещей конечным пользователям.

Это относится к единственным данным байта (т.е. ansii, SQL _ Latin1 *_*General_CP1, и. al.). Если необходимо хранить данные для нескольких кодовых страниц, или языки с помощью различных алфавитов, you’ll должен работать с типом данных nvarchar (который я думаю работы то же, два байта для количества charactesr, но каждый фактический символ данных требует двух байтов устройства хранения данных). Если у Вас будут строки, вероятно, для осмотра 8000, или более чем 4 000 в nvarchar, то необходимо будет использовать [n] varchar (макс.) типы данных.

И если Вы хотите знать, почему настолько очень важно занять место с дополнительными байтами только для отслеживания, какой длины данные, проверьте http://www.joelonsoftware.com/articles/fog0000000319.html

Philip

17
ответ дан 1 December 2019 в 17:59
поделиться

При поддержке языков кроме английского языка Вы захотите использовать nvarchar.

HTML должен быть хорошо, пока он содержит стандартные символы ASCII. Я использовал nvarchar главным образом в базах данных, которые были многоязычной поддержкой.

3
ответ дан 1 December 2019 в 17:59
поделиться

Поскольку существует 8 битов в 1 байте и так в 1 байте, можно сохранить до 256 отличных значений, который является

0 1 2 3 4 5 ... 255

Примечание, которое первое число 0, таким образом, это - в общей сложности 256 числа.

Поэтому при использовании nvarchar (255), Он будет использовать 1 байт для хранения длины из строки, но если Вы опрокидываетесь 1 и используете nvarchar (256) тогда, Вы тратите впустую еще 1 байт всего для того дополнительного 1 объекта прочь от 255 (так как Вам нужно 2 байта для хранения номера 256 ).

, Который не мог бы быть фактической реализацией SQL-сервера, но я полагаю, что это - типичное обоснование для ограничения вещей в 255 более чем 256 объектов.

и nvarchar для Unicode, которые используют 2 + байты на символ и
, varchar для нормального текста ASCII, которые только используют 1 байт

3
ответ дан 1 December 2019 в 17:59
поделиться

IIRC, 255 является макс. размером varchar в MySQL, прежде чем Вы должны были переключиться на тип данных text или были в какой-то момент (на самом деле, я думаю, что это выше теперь). Так хранение его к 255 могло бы купить Вас некоторая совместимость там. Вы захотите искать это прежде, чем действовать на него, все же.

varchar по сравнению с nvarchar отчасти похож на ASCII по сравнению с unicode. varchar, ограничен одним байтом за символ, nvarchar может использовать два. Вот почему у Вас может быть varchar (8000), но только nvarchar (4000)

2
ответ дан 1 December 2019 в 17:59
поделиться

varchar (255) был также максимальной длиной в SQL Server 7.0 и ранее.

2
ответ дан 1 December 2019 в 17:59
поделиться

И varchar и nvarchar авторазмер к содержанию, но число, которое Вы определяете при объявлении типа столбца, являются максимумом.

Значения в "nvarchar" поднимают дважды диск/пространство памяти как "varchar", потому что unicode составляет два байта, но когда Вы объявляете тип столбца, Вы объявляете количество символов, не байты.

Поэтому при определении типа столбца необходимо определить максимальное количество символов, что столбец должен будет когда-либо содержать и иметь это как varchar (или nvarchar) размер.

А хорошее эмпирическое правило состоит в том, чтобы оценить максимальную продолжительность ужаления, которую столбец должен содержать, затем добавить поддержку приблизительно на 10% больших символов к нему для предотвращения проблем с неожиданно длинными данными в будущем.

2
ответ дан 1 December 2019 в 17:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: