Perl DBI / FreeTDS / SQL-Server:如何插入/更新BLOB varbinarymax数据?

问题描述

我试图通过Linux中的DBI和freeTDS将二进制数据插入Microsoft SQL-Server 2014的VARBINARY(max)列中。

以下(简体)代码不起作用:

$data = "foobar"; # real binary data gives same error
$dbh = <...valid db-handle ...>;
$sth = $dbh->prepare ("UPDATE table SET data=? WHERE id=?");
$sth->bind_param (1,$data,DBI::SQL_VARBINARY);
$sth->bind_param (2,$some_id);
$sth->execute or die ...

结果:

ct_result(ct_dynamic(CS_PREPARE)) returned -205 at /usr/lib/x86_64-linux-gnu/perl5/5.28/DBD/Sybase.pm line 138.
DBD::Sybase::db prepare failed: Server message number=257 severity=16 state=3 line=1 server=SERVER text=Implicit conversion from data type varchar to varbinary(max) is not allowed. Use the CONVERT function to run this query. Server message number=8180 severity=16 state=1 line=1 server=...
Can't call method "bind_param" on an undefined value 

似乎bind_param调用尾部正确地编码了二进制数据。未定义的值错误似乎是绑定执行失败的结果。我为bind_param尝试了其他各种列类型,例如SQL_LONGVARBINARY,SQL_BLOB ...,但是错误保持不变。

解决方法

https://metacpan.org/pod/distribution/DBD-Sybase/dbd-sybase.pod#String-Data-Handling

DBD :: Sybase支持CHAR / VARCHAR / BINARY / VARBINARY,最大长度为255个字符,直到12.0x版本。从12.5开始,这些数据类型的最大大小为16K-但是要支持更大的大小,则必须使用Open Client 12.5或更高版本。

Sybase不区分CHAR和VARCHAR或BINARY和 VARBINARY

似乎DBD::Sybase忽略了DBI::SQL_VARBINARY提示,并以varchar的形式发送数据。

尝试:

UPDATE table SET data=CONVERT(VARBINARY(max),?,1) WHERE id=?

还要检查syb_use_bin_0x设置。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...