web-dev-qa-db-ja.com

nvarchar(max)vs NText

SQL Serverでnvarchar(max)データ型とNTextデータ型を使用する利点と欠点は何ですか?下位互換性は必要ないので、nvarchar(max)が古いSQL Serverリリースでサポートされないことは問題ありません。

編集:質問は、後でこれらのデータ型を検索する場合、TEXTおよびIMAGEvarchar(max)およびvarbinary(max)にも適用されるようです。

175
David Pfeffer

利点は、nvarchar(max)LENLEFTなどの関数を使用でき、ntextおよびtextに対してそれを実行できないことです。 textWRITETEXTを使用する必要があったUPDATETEXTよりも、nvarchar(max)を使用する方が簡単です。

また、textntextなどは廃止予定です( http://msdn.Microsoft.com/en-us/library/ms187993.aspx

186
SQLMenace

VARCHAR(MAX)は、TEXTフィールドを収容するのに十分な大きさです。 SQL Server 2000のTEXTNTEXTおよびIMAGEデータ型は、SQL Serverの将来のバージョンで非推奨になります。SQLServer 2005はデータ型との下位互換性を提供しますが、新しいデータを使用することをお勧めしますVARCHAR(MAX)NVARCHAR(MAX)、およびVARBINARY(MAX)のタイプ。

37
garpunkal

ntextは常にそのデータを別のデータベースページに保存しますが、nvarchar(max)はデータベースレコード自体にデータを保存しようとします。

そのため、nvarchar(max)はいくらか高速です(8 kBより小さいテキストがある場合)。また、データベースのサイズが少し遅くなることに気付きました。これも良いことです。

nvarchar(max)に進みます。

32
GvS

nvarchar(max)は使用したいものです。最大の利点は、このデータ型ですべてのT-SQL文字列関数を使用できることです。これはntextでは不可能です。私は本当の不利な点を知りません。

12
Randy Minder

Textの最大の欠点は(NTextおよびImageと一緒に)、 ドキュメント のように、SQL Serverの将来のバージョンで削除されることです。これにより、そのバージョンのSQL Serverがリリースされるときに、スキーマのアップグレードが効果的に難しくなります。

明らかにnvarchar(max)を使用する必要があります:

MSDN

4
WhiteWaterCoder

。WRITE 句を使用して、varchar(max)/nvarchar(max)データ型への部分的または完全な更新と高性能な追加を行えることを付け加えます。

こちら.WRITE句を使用した完全な例を見つけることができます。

1
gotqn

変換の経験を追加したかった。古代のLinq2SQLコードにはtextフィールドがたくさんありました。これは、インデックスに存在するtext列を rebuilt ONLINE にできるようにするためでした。

最初に長年のメリットについて知っていましたが、変換すると、SQL Serverがテーブルを再構築してすべてをコピーしなければならない恐ろしい長いクエリを意味し、Webサイトをダウンさせ、心拍数を上げると常に考えていました。

また、Linq2SQLが列タイプの何らかの検証を行っている場合、エラーが発生する可能性があることも心配しました。

ただし、ALTERコマンドがINSTANTLYを返したという報告を喜んでいます。したがって、テーブルメタデータを変更するだけです。 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

これにより、クエリの素敵なリストが表示され、選択して新しいウィンドウにコピーしました。私が言ったように-これを実行するとすぐでした。

enter image description here

Linq2SQLはかなり古く、テーブルをドラッグするデザイナーを使用します。 EF Codeの場合、状況は最初により複雑になるかもしれませんが、私はまだそれに取り組んでいません。

1
Simon_Weaver