我使用SQL Server数据库来存储非常长的Unicode字符串。该字段来自类型' ntext',理论上应该限制为2 ^ 30个Unicode字符。
NTEXT
可变长度Unicode数据,最大字符串长度为2 ^ 30 - 1(1,073,741,823)字节。存储大小(以字节为单位)是输入的字符串长度的两倍。 ntext的ISO同义词是national 文本。
我做了这个测试:
生成50,000个字符的字符串。
运行更新SQL语句
更新[表格] SET Response =' ... 50,000字符串......' 在哪里ID =' 593BCBC0-EC1E-4850-93B0-3A9A9EB83123'
检查结果 - 最后实际存储在字段中的内容。
结果是字段[Response]包含仅包含43,479个字符。字符串末尾的所有字符都被抛弃了。
为什么会这样?我怎么解决这个问题?
如果这确实是此数据类型(ntext)的容量限制,哪个其他数据类型可以存储更长的Unicode字符串?
答案 0 :(得分:2)
NTEXT
数据类型,您应该使用NVARCHAR(MAX)
。
我看到两种可能的解释:
用于连接数据库截断参数值的ODBC
驱动程序值太长(尝试使用SSMS
)
您写的是生成输入字符串。我怀疑你生成CHAR(0)
Null literal
如果是第二种情况,请确保无法生成\0
字符。
修改强>
我不知道你如何查看长度,但请记住LEN
不计算尾随空格
SELECT LEN('aa ') AS length -- 2
,DATALENGTH('aa ') AS datalength -- 7
我认为你做的最后一个可能的解决方案是:
SELECT 'aa aaaa'
-- result in SSMS `aa aaaa`: so when you count you lose all multiple whitespaces
如果返回 100k :
,请检查以下查询SELECT DATALENGTH(ntext_column)
答案 1 :(得分:0)
根据我所看到的情况,您可能只能复制43679个字符。它存储了所有字符,它们位于数据库中(使用Select Len(Reponse)检查这个来自[table] Where ...来验证这一点),并且SSMS的复制问题比你去看看时更多数据
答案 2 :(得分:0)
对于所有字节;右键单击网格结果,然后单击将结果保存到文件。
答案 3 :(得分:0)
可以确认。实际限制为43679。订阅服务在一周内出现问题。每个数据看起来都不错,但是仍然给我们一个错误,即其中一个字段具有无效值,甚至可以输入正确的值。结果证明,参数存储在NText中,并且最大值为43679个字符。而且由于我们无法更改数据库设计,因此我们必须为同一事物进行2个不同的订阅,并将一半实体分配给另一实体。