nvarchar(max)とNText


183

SQL Serverでnvarchar(max)vs NTextデータ型を使用する利点と欠点は何ですか?下位互換性は必要ないためnvarchar(max)、以前のSQL Serverリリースではサポートされていません。

編集:どうやら質問にもに適用TEXTし、IMAGEvarchar(max)varbinary(max)後でそれらのデータ・タイプのものの検索のために、。

回答:


197

利点は、あなたのような機能を使用することができますLENし、LEFTnvarchar(max)、あなたはその反対を行うことはできませんntexttext。また、やを使用する必要があった場所nvarchar(max)よりも作業が簡単textです。WRITETEXTUPDATETEXT

また、textntext、など、推奨されている(http://msdn.microsoft.com/en-us/library/ms187993.aspx


12
SQL Server 2016はまだそれらをサポートしているようです。
Confluence

1
@Confluence歴史的に、SQL Serverでの存在に関する限り、textおよびnTextはvarcharおよびnvarcharよりも古いデータ型ですか?
RBTは2016年

WRITETEXTおよびUPDATETEXTを使用する必要はありません。たぶん2010年にあなたがやった!さらなる情報に興味があります。
Simon_Weaver

38

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


32

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

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

ゴーnvarchar(max)


13

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


私が理解していないのは、彼らが一緒に行くと言っていることですがnvarchar(max)、それは私を4000文字に制限します。それ以上のフィールドを保持したい場合はどうなりますか?
VoidKing 2013

2
nvarchar(max)は4000文字に制限しません。文字数に制限はありません。また、SQL Serverでは、textとntextは廃止されています。つまり、将来のバージョンではサポートされなくなります。
ランディミンダー

OIC、私はSQL Server CEを使用していますが、nvarchar(max)4000文字に制限されています。したがって、SQL Server Compactでは、ntext場合によっては使用するしかありません。彼らがそれをやめたとき、私はいくつかのサイトをアップグレードする必要がないだけだと思います。
VoidKing 2013

1
@RandyMinder nvarchar(max)は無制限のストレージではありません。SQL Serverのドキュメントに従って、「最大は最大ストレージサイズが2 ^ 31-1バイト(2 GB)であることを示します。ストレージサイズは、バイト単位で、入力されたデータの実際の長さの2倍+ 2バイトです。」
Shiv



3

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

最初に私は長年の利点について知っていましたが、常に変換がSQL Serverがテーブルを再構築してすべてをコピーしなければならない恐ろしい長いクエリを意味し、私のWebサイトを停止し、心拍数を上げると常に想定していました。

また、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句の使用の完全な例を見つけることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.