Sql varchar (max) vs varchar (исправить)

Каждый раз, когда я путаюсь для выбора типа данных varchar (max) или varchar (fix). предположим, что у меня есть столбец данных, который будет около 5000 varchar. столбец не является нулевым типом.

должен ли я установить varchar (max) не null или varchar (5000), но не null.

то же самое в случае типа данных с нулевым значением.

CREATE TABLE [dbo].[tblCmsPages](
[CmsPagesID] [int] IDENTITY(1,1) NOT NULL,
[PageName] [varchar](250) NOT NULL,
[PageContent] [varchar](max) NOT NULL,
[Sorting] [int] NOT NULL,
[IsActive] [bit] NOT NULL) 

//или

CREATE TABLE [dbo].[tblCmsPages](
[CmsPagesID] [int] IDENTITY(1,1) NOT NULL,
[PageName] [varchar](250) NOT NULL,
[PageContent] [varchar](5000) NOT NULL,
[Sorting] [int] NOT NULL,
[IsActive] [bit] NOT NULL

//[PageContent] будет 5000 char или одиночный char или null, то что я должен делать.

Думаю, что я хочу знать. В чем основное отличие между null и не null. Это только для проверки достоверности и того, что влияет на производительность.

Ответ 1

MSDN

  • Используйте varchar, когда размеры записей данных столбца значительно различаются.
  • Используйте varchar (max), когда размеры записей данных столбца значительно различаются, а размер может превышать 8000 байт.

Если длина указана в объявлении переменной или столбца VARCHAR, максимально допустимая длина составляет 8000. Если длина больше 8000, вы должны использовать спецификатор MAX в качестве длины. Если указана длина более 8000, возникнет следующая ошибка (при условии, что указана длина 10000):

Размер (10000), присвоенный типу 'varchar', превышает максимально допустимый для любого типа данных (8000).

ОБНОВЛЕНИЕ: - Я нашел ссылку, которой я хотел бы поделиться: -

Вот

Существует Varchar[(n)] разница в производительности между Varchar[(n)] и Varchar(Max). Varchar[(n)] обеспечивает лучшие результаты производительности по сравнению с Varchar(Max). Если мы знаем, что данные, которые должны храниться в столбце или переменной, меньше или равны 8000 символов, то использование этого типа данных Varchar [(n)] обеспечивает лучшую производительность по сравнению с Varchar (Max). Пример. Сценарий, изменив тип переменной @FirstName на Varchar(Max) тогда для 1 миллиона назначений это последовательно занимает вдвое больше времени, чем когда мы использовали тип данных в качестве

Varchar(50) for variable @ FirstName.
DECLARE @FirstName VARCHAR(50), @COUNT INT=0, @StartTime DATETIME = GETDATE()
WHILE(@COUNT < 1000000)
BEGIN
SELECT @FirstName = 'Suraj', @COUNT = @COUNT +1
END
SELECT DATEDIFF(ms,@StartTime,GETDATE()) 'Time Taken in ms'
GO 

Ответ 2

У вас есть четкое представление о данных, оно не должно превышать 5000, я предпочитаю varchar (n) (varchar (5000).

Если вы хотите выбрать между varchar (n) и varchar (max), обратите внимание ниже:

  • При необходимости используйте VARCHAR (n) над VARCHAR (MAX)

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

    б. потому что данные VARCHAR (MAX) не сжимают

  • Хранение больших строк занимает больше времени, чем хранение небольших строк.

  • Обновление значения VARCHAR (MAX) в строке от 8000 до 8000 будет относительно медленным, но разница для одной транзакции, вероятно, не будет измерима.

  • Обновление значения VARCHAR (MAX) в строке в размере от 8000 до менее 8 000 будет быстрее, чем если таблица настроена на сохранение данных вне строки.

  • Использование опции out-of-row для VARCHAR (MAX) приведет к медленной записи до тех пор, пока строки не будут длинными.

Ответ 3

"около 5000" - если вы этого не знаете, тогда настройка будет максимальной, вероятно, лучше всего. С другой стороны, если вы знаете, что он не будет превышать 6000, вы можете использовать этот потолок, чтобы сэкономить некоторое пространство.

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

Как разрешить null или нет null: Лично я предпочитаю, в большинстве случаев, допускать null. Прежде всего нуль означает что-то, а во-вторых, я предпочитаю устанавливать такие ограничения в интерфейсе. Но это зависит от сохраненных данных.

Ответ 4

Чем больше varchar, тем больше пространства потребуется для вашей базы данных. Лучшая практика заключается в том, чтобы выделить как можно меньше места, поэтому в вашем случае второй код лучше.

[PageContent] [varchar](5000) NOT NULL,

В этом случае вы не можете сохранить более 5000 char в столбце.

Ответ 5

сначала позвольте мне разницу между обоими

В столбце nvarchar могут храниться любые данные Unicode. Столбец varchar ограничен 8-разрядной кодовой страницей. Некоторые люди думают, что вархар следует использовать, потому что он занимает меньше места. Я считаю, что это не правильный ответ. Codepage incompatabilities - это боль, а Unicode - это средство для проблем с кодировкой. В настоящее время с дешевым диском и памятью нет причин для того, чтобы тратить время на работу с кодовыми страницами.

Все современные операционные системы и платформы разработки используют Unicode. Используя nvarchar, а не varchar, вы можете избегать конверсий при каждом чтении или записи в базу данных. Конверсии требуют времени и подвержены ошибкам. И восстановление от ошибок преобразования является нетривиальной проблемой.

Если вы взаимодействуете с приложением, использующим только ASCII, я бы по-прежнему рекомендовал использовать Unicode в базе данных. Алгоритмы сопоставления ОС и базы данных будут работать лучше с Unicode. Unicode избегает проблем с конверсией при взаимодействии с другими системами. И вы будете готовиться к будущему. И вы всегда можете подтвердить, что ваши данные ограничены 7-разрядным ASCII для любой прежней системы, которую вы должны поддерживать, даже наслаждаясь некоторыми преимуществами полного хранилища Unicode.

И если вы используете размер исправления, предположите 5000, то вы можете сохранить upto 5000 только в том случае, если длина текста увеличится, тогда вы получите сообщение об ошибке. поэтому [PageContent] [varchar](max) NOT NULL, лучше, но если вы уверены, что длина строки не будет больше больше 5000, тогда [PageContent] varchar NOT NULL лучше

nchar [ ( n ) ] Строковые данные Unicode с фиксированной длиной. n определяет длину строки и должен быть значением от 1 through 4,000. Размер хранилища равен двум байтам. Если на кодовой странице коллинга используются двухбайтовые символы, размер хранилища по-прежнему равен n байтам. В зависимости от строки размер хранилища в n байтах может быть меньше значения, указанного для n. Синонимы ISO для nchar являются национальными char и национальными символами..

nvarchar [ ( n | max ) ] Строковые данные Unicode с переменной длиной. n определяет длину строки и может быть значением от 1 до 4000. max указывает, что максимальный размер хранилища составляет 2 ^ 31-1 байта (2 ГБ). Размер памяти в байтах в два раза превышает фактическую длину введенных данных + 2 байта. Синонимы ISO для nvarchar являются национальными char различными и национальными символами.

По мне используют nvarchar [ ( n | max ) ], поэтому вы не будете зависеть от длины строки

ref: для получения дополнительной информации https://msdn.microsoft.com/en-IN/library/ms186939.aspx