sql-server - Perl DBI / FreeTDS / SQL-Server:如何插入/更新 BLOB varbinary(max) 数据?
问题描述
我正在尝试通过 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,直到 12.0x 版本的长度限制为 255 个字符。从 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设置。
推荐阅读
- python - 无法使用 Python 的 Ipaddress 模块获取网络的广播地址
- c++ - 在 Visual Studio 代码程序中包含自定义 C++ .h 和 .cpp 文件
- flutter - 如何在颤动的webview中显示pdf
- node.js - 使用 socket.io 将 ESP32 连接到 nodejs 服务器中的特定房间
- c# - 在 c# 中使用具有第一个字母“AA”的条件的 Find()
- spring - 忽略 Spring Boot 中某些端点的授权
- python - 验证损失不断减少,而训练损失在 3 个 epoch 后开始增加
- reactjs - ReactJS 警告:更改组件后遇到两个具有相同键的子项
- image - 在 Flutter 中,如何在主屏幕中接收图像,然后将其重定向到另一个屏幕?
- reactjs - 刷新网页后,React webpack hotload 卡在 index.html 上