SQL 服务器 NText 字段限制为 43,679 个字符?
SQL Server NText field limited to 43,679 characters?
我使用 SQL 服务器数据库来存储很长的 Unicode 字符串。该字段来自 'ntext' 类型,理论上应限制为 2^30 个 Unicode 字符。
ntext
Variable-length Unicode data with a maximum string length of 2^30 - 1 (1,073,741,823) bytes. Storage size, in bytes, is two times the string length that is entered. The ISO synonym for ntext is national
text.
我做了这个测试:
生成50,000个字符的字符串。
运行 更新 SQL 语句
更新[table]
SET Response='... 50,000 个字符串...'
其中 ID='593BCBC0-EC1E-4850-93B0-3A9A9EB83123'
检查结果 - 最后字段中实际存储的内容。
结果是字段 [Response] 包含 仅 43,679 个字符。字符串末尾的所有字符都被丢弃了。
为什么会这样?我该如何解决这个问题?
如果这真的是这种数据类型(ntext)的容量限制,还有哪种数据类型可以存储更长的 Unicode 字符串?
NTEXT
数据类型已弃用,您应该使用 NVARCHAR(MAX)
.
我看到两种可能的解释:
您用来连接数据库的 ODBC
驱动程序在太长时截断参数值(尝试使用 SSMS
)
你写你生成你的输入字符串。我怀疑你生成的 CHAR(0)
是 Null literal
如果是第二种情况,请确保您不能生成 [=19=]
个字符。
编辑:
我不知道你是如何检查长度的,但请记住 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
检查下面的查询如果 returns 100k:
SELECT DATALENGTH(ntext_column)
据我所知,您可能只能复制 43679 个字符。它正在存储所有字符,它们在数据库中(使用 [Select Len(Reponse) From [table] Where... 验证这一点),并且 SSMS 在复制超过当你去查看完整数据时。
对于所有字节;右键单击网格结果并单击将结果保存到文件。
可以确认。实际限制是 43679。订阅服务出现问题已经一周了。每个数据看起来都不错,但它仍然给我们一个错误,其中一个字段具有无效值,即使如此,它也得到了正确的值。事实证明,参数存储在 NText 中,并且最大长度为 43679 个字符。而且因为我们无法更改数据库设计,所以我们不得不为同一事物进行 2 次不同的订阅,并将一半的实体放入另一个。
我使用 SQL 服务器数据库来存储很长的 Unicode 字符串。该字段来自 'ntext' 类型,理论上应限制为 2^30 个 Unicode 字符。
ntext
Variable-length Unicode data with a maximum string length of 2^30 - 1 (1,073,741,823) bytes. Storage size, in bytes, is two times the string length that is entered. The ISO synonym for ntext is national text.
我做了这个测试:
生成50,000个字符的字符串。
运行 更新 SQL 语句
更新[table] SET Response='... 50,000 个字符串...' 其中 ID='593BCBC0-EC1E-4850-93B0-3A9A9EB83123'
检查结果 - 最后字段中实际存储的内容。
结果是字段 [Response] 包含 仅 43,679 个字符。字符串末尾的所有字符都被丢弃了。
为什么会这样?我该如何解决这个问题?
如果这真的是这种数据类型(ntext)的容量限制,还有哪种数据类型可以存储更长的 Unicode 字符串?
NTEXT
数据类型已弃用,您应该使用 NVARCHAR(MAX)
.
我看到两种可能的解释:
您用来连接数据库的
ODBC
驱动程序在太长时截断参数值(尝试使用SSMS
)你写你生成你的输入字符串。我怀疑你生成的
CHAR(0)
是Null literal
如果是第二种情况,请确保您不能生成 [=19=]
个字符。
编辑:
我不知道你是如何检查长度的,但请记住 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
检查下面的查询如果 returns 100k:
SELECT DATALENGTH(ntext_column)
据我所知,您可能只能复制 43679 个字符。它正在存储所有字符,它们在数据库中(使用 [Select Len(Reponse) From [table] Where... 验证这一点),并且 SSMS 在复制超过当你去查看完整数据时。
对于所有字节;右键单击网格结果并单击将结果保存到文件。
可以确认。实际限制是 43679。订阅服务出现问题已经一周了。每个数据看起来都不错,但它仍然给我们一个错误,其中一个字段具有无效值,即使如此,它也得到了正确的值。事实证明,参数存储在 NText 中,并且最大长度为 43679 个字符。而且因为我们无法更改数据库设计,所以我们不得不为同一事物进行 2 次不同的订阅,并将一半的实体放入另一个。