SQL Serverでnvarchar(max)
データ型とNText
データ型を使用する利点と欠点は何ですか?下位互換性は必要ないので、nvarchar(max)
が古いSQL Serverリリースでサポートされないことは問題ありません。
編集:質問は、後でこれらのデータ型を検索する場合、TEXT
およびIMAGE
対varchar(max)
およびvarbinary(max)
にも適用されるようです。
利点は、nvarchar(max)
でLEN
やLEFT
などの関数を使用でき、ntext
およびtext
に対してそれを実行できないことです。 text
とWRITETEXT
を使用する必要があったUPDATETEXT
よりも、nvarchar(max)
を使用する方が簡単です。
また、text
、ntext
などは廃止予定です( http://msdn.Microsoft.com/en-us/library/ms187993.aspx )
VARCHAR(MAX)
は、TEXT
フィールドを収容するのに十分な大きさです。 SQL Server 2000のTEXT
、NTEXT
およびIMAGE
データ型は、SQL Serverの将来のバージョンで非推奨になります。SQLServer 2005はデータ型との下位互換性を提供しますが、新しいデータを使用することをお勧めしますVARCHAR(MAX)
、NVARCHAR(MAX)
、およびVARBINARY(MAX)
のタイプ。
ntext
は常にそのデータを別のデータベースページに保存しますが、nvarchar(max)
はデータベースレコード自体にデータを保存しようとします。
そのため、nvarchar(max)
はいくらか高速です(8 kBより小さいテキストがある場合)。また、データベースのサイズが少し遅くなることに気付きました。これも良いことです。
nvarchar(max)
に進みます。
nvarchar(max)
は使用したいものです。最大の利点は、このデータ型ですべてのT-SQL文字列関数を使用できることです。これはntext
では不可能です。私は本当の不利な点を知りません。
Text
の最大の欠点は(NText
およびImage
と一緒に)、 ドキュメント のように、SQL Serverの将来のバージョンで削除されることです。これにより、そのバージョンのSQL Serverがリリースされるときに、スキーマのアップグレードが効果的に難しくなります。
明らかにnvarchar(max)
を使用する必要があります:
変換の経験を追加したかった。古代の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
これにより、クエリの素敵なリストが表示され、選択して新しいウィンドウにコピーしました。私が言ったように-これを実行するとすぐでした。
Linq2SQLはかなり古く、テーブルをドラッグするデザイナーを使用します。 EF Codeの場合、状況は最初により複雑になるかもしれませんが、私はまだそれに取り組んでいません。