一、引起的源頭
環境:vs2015,sqlserver2008
相關程序包:ef6
定義了一個實體article
public class Article { public string Data{get;set;} }
EntityTypeConfiguration的配置
Property(a => a.Data).IsRequired().HasColumnType("text");
這樣可以正常生成表字段,而且類型也正確
插入數據的時候,就引起了以下異常
System.Data.SqlClient.SqlException: 數據類型 text 和 varchar 在 equal to 運算符中不兼容。
二、解決
剛開始,以為是沒有指定導致轉換錯誤
[Column(TypeName="text")] public string Data{get;set;}
再次插入數據,還是導致一樣的錯誤
經過多次試驗,
最后結果就是 不指定類型為text,系統自動指定類型為 nvarchar(MAX)
三、解析
按SQL2005來說,varchar如果有定義字符數,那么最大就是8000,超過會產生二進制截斷。
而varchar(max)、nvarchar(max) 和 varbinary(max) 統稱為大值數據類型。可以存儲最大為 2^31-1 個字節的數據。
varchar ( max) 注解如下: varchar [ ( n | max) ] 可變長度,非 Unicode 字符數據。n 的取值范圍為 1 至 8,000。max 指示最大存儲大小是 2^31-1 個字節. 在 Microsoft SQL Server 的未來版本中將刪除 ntext、text 和 image 數據類型。請避免在新開發工作中使用這些數據類型,並考慮修改當前使用這些數據類型的應用程序。
當存儲字符長度<=8000時,存儲機制跟常規varchar一樣,實際占用空間=字符長度+2(結束標識)。
當存儲字符長度>8000時,存儲機制跟text一樣。
varchar(max)支持的最大長度是系統支持的最大長度,如在32位SQL Server上其最大長度為2G字節。
字符長度小於等於8000時,不管varchar還是varchar(max)都是存多少占多少。
