【问题标题】:Text data getting cut off when returned from DB从数据库返回时文本数据被截断
【发布时间】:2012-07-23 00:05:03
【问题描述】:

当我在 php 中使用 MSSQL 读取具有非常长内容的字段时,我得到一个错误

警告:mssql_query() [function.mssql-query]:Unicode 唯一排序规则中的 Unicode 数据或 ntext 数据无法使用 DB-Library(例如 ISQL)或 ODBC 版本 3.7 或更早版本发送到客户端

我在网上搜索了一下,发现要解决这个问题,发现需要对结果进行强制转换才能得到可读的文本。

SELECT CAST(Content AS TEXT) AS Content FROM myTable

但是,我遇到的另一个问题是文本数据在 4096 个字符后被截断。是否有进一步阅读文本,或转换返回数据的其他选项?

谢谢

【问题讨论】:

  • 数据库中Content是什么类型?你确定它存储了超过 4096 个字符吗?
  • 内容是 ntext。而且我确信它存储了超过 4096 个字符。当我通过 myLittleAdmin 读取数据库时,它在我的 PHP 代码中被截断后显示更多。
  • 什么版本的 SQL Server?为什么要使用 NTEXT 而不是 NVARCHAR(MAX)?您如何通过计算 Management Studio 中的输出来验证有 4096 个字符?这会被应用程序截断,并且绝对不会反映数据库中的内容。

标签: php sql-server string casting truncate


【解决方案1】:

如果您在 Management Studio 中计算字符数,请尝试:

SELECT LEN(Content), DATALENGTH(Content) FROM dbo.myTable;

仍然显示 4096 吗?我打赌不会。

我认为您不想转换为 TEXT。我假设您使用的是 NTEXT,因为您可能有 Unicode 字符。转换为 TEXT 将消除任何双字节字符并实际更改您的数据。也许您可以从您的应用程序中尝试:

SELECT CONVERT(NVARCHAR(MAX), Content) FROM dbo.myTable;

并且不要依赖 Management Studio 的输出来证明数据库中的实际内容。默认情况下它会被截断,并且即使您更改默认值(不同的字符数取决于结果到文本或结果到网格),它也会被限制在一个固定的最大值。如果您想知道一列中有多少数据,请询问 SQL Server(就像我在上面所做的那样),而不是 Management Studio。

【讨论】:

  • 我没有使用 Management Studio,我使用 php 代码并查询数据库,然后我使用 "echo strlen($content)" 获取输出/字符数。
  • 另外,当我使用 LEN(Content) 时,我得到与直接查询字段完全相同的错误(没有 CAST)
  • @IanHsieh 你能在 Management Studio 中试试吗?这将证明问题出在 PHP 或您正在使用的驱动程序版本上。您能否编辑问题以包含我在问题上留下的 cmets 的答案?
  • 我解决了,在 PHP 设置中,它将文本值长度从 mssql 限制为 4096。所以我只需要将值更改为适合我的足够大的数字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-07
  • 1970-01-01
  • 2013-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多