nvarchar (макс.) проти NText


183

Які переваги та недоліки використання nvarchar(max)проти NTextданих типів у SQL Server? Мені не потрібна зворотна сумісність, тому добре, що nvarchar(max)не підтримується у старих версіях SQL Server.

Редагувати: Очевидно, це питання також стосується TEXTта IMAGEпроти, varchar(max)а також varbinary(max)для тих, хто шукає ці типи даних пізніше.

Відповіді:


197

Переваги полягають у тому, що ви можете використовувати такі функції, як LENі LEFTввімкнути, nvarchar(max)і не можете цього робити проти ntextі text. З ним також простіше працювати, nvarchar(max)ніж textтам, де вам довелося користуватися WRITETEXTі UPDATETEXT.

Крім того , text, ntextі т.д., в даний час НЕ рекомендується ( http://msdn.microsoft.com/en-us/library/ms187993.aspx )


12
SQL Server 2016, очевидно, все ще їх підтримуватиме.
Злиття

1
@Confluence Історично чи є текст та nText старішим типом даних, ніж varchar та nvarchar, наскільки це стосується їхнього існування в SQL Server?
RBT

Ви НЕ ХОТИ використовувати WRITETEXT та UPDATETEXT. Можливо, у 2010 році ви все-таки зробили! Зацікавлені для будь-якої додаткової інформації.
Simon_Weaver

38

VARCHAR(MAX)досить великий, щоб розмістити TEXTполе. TEXT, NTEXTІ IMAGEтипи даних SQL Server 2000 буде застарілим в версії майбутнього в SQL Server, SQL Server 2005 забезпечує зворотну сумісність з типами даних , але рекомендується використовувати нові типи даних , які VARCHAR(MAX), NVARCHAR(MAX)і VARBINARY(MAX).


32

ntextзавжди зберігатиме свої дані на окремій базі даних, тоді як nvarchar(max)намагатиметься зберігати дані в самій записи бази даних.

Це nvarchar(max)дещо швидше (якщо у вас є текст розміром менше 8 кБ). Я також помітив, що розмір бази даних буде рости трохи повільніше, це теж добре.

Іди nvarchar(max).


13

nvarchar(max)це те, що ви хочете використовувати. Найбільшою перевагою є те, що ви можете використовувати всі рядкові функції T-SQL для цього типу даних. З цим неможливо ntext. Я не знаю жодних реальних недоліків.


Що я не розумію, це те, що вони кажуть піти, nvarchar(max)але це обмежує мене до 4000 символів. Що робити, якщо я хочу, щоб поле займало більше цього?
VoidKing

2
nvarchar (max) не обмежує вас 4000 символів. У вас необмежена кількість символів. Крім того, SQL Server припинив текст і ntext. Це означає, що в майбутній версії вони більше не підтримуватимуться.
Ренді Міндер

OIC, я використовую SQL Server CE, який НЕ обмежує мою кількість nvarchar(max)4000 символів. Тож для SQL Server Compact у мене немає іншого вибору, як використовуватись ntextу деяких випадках. Коли вони припиняють це, я вважаю, що мені доведеться просто не оновлювати деякі сайти.
VoidKing

1
@RandyMinder nvarchar (макс.) Не є необмеженим сховищем. Згідно з документацією на SQL Server "max вказує на те, що максимальний розмір пам’яті становить 2 ^ 31-1 байт (2 ГБ). Розмір пам’яті у байтах удвічі перевищує фактичну довжину введених даних + 2 байти».
Шив



3

Хотів додати свій досвід перетворення. У мене було багато textполів стародавнього коду Linq2SQL. Це дозволило переглядати textстовпці, присутні в індексах, ONLINE .

Спершу я знав про переваги роками, але завжди вважав, що перетворення означатиме страхітливі довгі запити, коли SQL Server повинен був би відновити таблицю і скопіювати все, знизивши мої веб-сайти та підвищивши частоту серця.

Я також був стурбований тим, що Linq2SQL може викликати помилки, якщо він проводить якусь перевірку типу стовпців.

Раді повідомити, що команди ALTER повернулися Мгновно - тому вони, безумовно, лише змінюють метадані таблиці. Може траплятися робота в режимі офлайн, щоб повернути <8000 символьних даних назад до таблиці, але команда ALTER була миттєвою.

Я запустив наступне, щоб знайти всі стовпці, які потребують конверсії:

SELECT concat('ALTER TABLE dbo.[', table_name, '] ALTER COLUMN [', column_name, '] VARCHAR(MAX)'), table_name, column_name
FROM information_schema.columns where data_type = 'TEXT' order by table_name, column_name

SELECT concat('ALTER TABLE dbo.[', table_name, '] ALTER COLUMN [', column_name, '] NVARCHAR(MAX)'), table_name, column_name
FROM information_schema.columns where data_type = 'NTEXT' order by table_name, column_name

Це дало мені хороший список запитів, які я щойно обрав і скопіював у нове вікно. Як я вже говорив - запустити це було моментально

введіть тут опис зображення

Linq2SQL досить давній - він використовує конструктор, на який ви перетягуєте таблиці. Ситуація, можливо, спочатку є більш складною для коду EF, але я цього ще не вирішував.


1

Хочу додати, що ви можете використовувати пункт .WRITE для часткових або повних оновлень та додавання високої продуктивності до varchar(max)/nvarchar(max)типів даних.

Тут ви можете знайти повний приклад використання .WRITEпункту.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.