PHP从MSSQL数据库无法获取TEXT类型数据求助
解决PHP通过ODBC读取MSSQL TEXT类型字段无输出的问题
我之前也碰到过一模一样的情况!MSSQL的TEXT类型属于老式的大对象(LOB)类型,PHP原生ODBC函数对它的处理逻辑和普通的VARCHAR、DECIMAL完全不一样,这就是为啥加了这个字段就没输出的原因。给你几个亲测有效的解决办法:
1. 查询时转换TEXT为VARCHAR(MAX)
MSSQL官方早就推荐用VARCHAR(MAX)替代TEXT类型了,兼容性好太多。你不用改表结构,直接在SQL语句里做转换就行:
SELECT -- 保留其他需要的字段 CAST(NOTES AS VARCHAR(MAX)) AS NOTES FROM dbo.Stock
这样PHP读取的时候就会把它当成普通字符串处理,不会出现无输出的情况。
2. 配置ODBC的长文本读取参数
原生ODBC函数默认可能限制了长文本的读取长度,你可以在执行查询后手动设置允许读取任意长度的长文本:
$connect = odbc_connect("你的DSN", "用户名", "密码"); $sql = "SELECT NOTES FROM dbo.Stock"; $result = odbc_exec($connect, $sql); // 设置允许读取任意长度的长文本(0表示不限制) odbc_longreadlen($result, 0); while ($row = odbc_fetch_array($result)) { echo $row['NOTES']; }
另外,也可以在odbc_connect的时候指定连接选项,强制使用ODBC游标处理LOB:
$connect = odbc_connect("你的DSN", "用户名", "密码", SQL_CUR_USE_ODBC);
3. 换成PDO_ODBC连接
原生ODBC函数对LOB的支持确实拉胯,换成PDO的话处理起来更稳定,代码也更简洁:
try { $pdo = new PDO("odbc:你的DSN", "用户名", "密码"); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $pdo->query("SELECT NOTES FROM dbo.Stock"); while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { // 这里正常输出NOTES内容 echo $row['NOTES']; } } catch(PDOException $e) { echo "错误: " . $e->getMessage(); }
额外排查点
先在SSMS(SQL Server管理工具)里执行同样的查询,确认NOTES字段的内容是不是正常的——比如有没有全是NULL值、包含不可见控制字符的情况,排除数据本身的问题。
内容的提问来源于stack exchange,提问作者AlexioHill
相关产品推荐
相关产品推荐

