简体   繁体   English

Perl DBI / FreeTDS / SQL-Server:如何插入/更新 BLOB varbinary(max) 数据?

[英]Perl DBI / FreeTDS / SQL-Server: How to insert/update BLOB varbinary(max) data?

I am trying to insert binary data into a VARBINARY(max) column on an Microsoft SQL-Server 2014 via DBI and freeTDS in Linux.我正在尝试通过 Linux 中的 DBI 和 freeTDS 将二进制数据插入到 Microsoft SQL-Server 2014 上的 VARBINARY(max) 列中。

Following (simplified) code does not work:以下(简化)代码不起作用:

$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 ...

Results in:结果是:

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 

It seems like the bind_param call tails to encode the binary data correctly.似乎 bind_param 调用尾部正确编码二进制数据。 The undefined value error seems to be a result of the failed bind execution.未定义值错误似乎是绑定执行失败的结果。 I tried various other column types for bind_param like SQL_LONGVARBINARY, SQL_BLOB ... but the error stays the same.我为 bind_param 尝试了各种其他列类型,如 SQL_LONGVARBINARY、SQL_BLOB ...但错误保持不变。

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

DBD::Sybase supports CHAR/VARCHAR/BINARY/VARBINARY, limited to 255 characters in length up to version 12.0x. DBD::Sybase 支持 CHAR/VARCHAR/BINARY/VARBINARY,长度限制为 255 个字符,直到版本 12.0x。 As of 12.5 these datatypes can be up to 16K in size - but supporting the larger sizes requires that Open Client 12.5 or later be used.从 12.5 开始,这些数据类型的大小最多可达 16K - 但支持更大的大小需要使用 Open Client 12.5 或更高版本。

Sybase does not differentiate between CHAR and VARCHAR or BINARY and VARBINARY Sybase 不区分 CHAR 和 VARCHAR 或 BINARY 和 VARBINARY

It seems that DBD::Sybase ignores DBI::SQL_VARBINARY hint and sends the data as varchar .似乎DBD::Sybase忽略了DBI::SQL_VARBINARY提示并将数据作为varchar发送。

Try:尝试:

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

Also check syb_use_bin_0x setting.还要检查syb_use_bin_0x设置。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Perl DBI / MS ODBC 驱动程序 (LinuxL:RHEL) / SQL-Server:如何插入/更新 BLOB varbinary(max) 数据? - Perl DBI / MS ODBC Driver (LinuxL:RHEL) / SQL-Server: How to insert/update BLOB varbinary(max) data? SQL Server - 如何插入Varbinary(Max)列? - SQL Server - How to insert into Varbinary(Max) column? JAVA-SQL Server将字符串值插入varbinary(max)数据类型 - JAVA - SQL server insert string value into varbinary(max) data type 如何将 Byte[] 转换为数据以在 SQL Server 的 varbinary(max) 列中插入值? - How convert a Byte[] to a data to insert a value in a varbinary(max) column in SQL Server? 在 SQL 服务器上的 VarBinary(max) 列上插入数据不会插入全长 VarBinary - Inserting data on VarBinary(max) column on SQL Server does not insert full length VarBinary 如何使用 Flask 更新 SQL Server 中的 varbinary(max) 列? - How can I update varbinary(max) columns in SQL Server with flask? sql 服务器 varbinary 数据 output 到 azure blob - sql server varbinary data output to azure blob 最大(SQL-Server) - Max (SQL-Server) 用于SQL Server和DAO的SQL Server本机客户端/ ODBC驱动程序无法将blob&gt; 8k插入varbinary(MAX)字段 - SQL Server Native Client / ODBC Driver for SQL Server & DAO can't insert blob > 8k into varbinary(MAX) field Spring JPA - 从 BLOB 到 varbinary(max) 错误的 SQL Server 转换 - Spring JPA - SQL Server Conversion from BLOB to varbinary(max) error
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM