tds_fdw PostgreSQL Foreign Table 将大文本截断为 2048 个字符

tds_fdw PostgreSQL Foreign Table Truncates Large Text to 2048 Characters

我已经创建了几个外国 tables,它们都工作正常,但现在我必须处理一个 table,它有一个包含 20-30 KB 文本的列行。如果该文本很小,则会完整呈现,但如果恰好超过 2048 个字符,则其余部分将被截断。

我的 tds_fdw 设置:

CREATE SERVER mssql_srv
FOREIGN DATA WRAPPER tds_fdw
OPTIONS (servername 'mssql_srv.my_domain.com', port '1433', database 'MY_DB', msg_handler 'blackhole');

ALTER SERVER mssql_srv OWNER TO my_user;

CREATE USER MAPPING FOR my_user
SERVER mssql_srv
OPTIONS (username 'my_user', password 'xxxxxxxx');

CREATE FOREIGN TABLE my_large_table (
  ID VARCHAR (64),
  FULL_TEXT TEXT)
SERVER vsql_tx
OPTIONS (schema_name 'dbo', table_name 'my_large_table', row_estimate_method 'showplan_all');

是的,MSSQL 侧的列名是大写的。它们的数据类型是:

ID nvarchar(64)
FULL_TEXT nvarchar(max)
SELECT * FROM my_large_table;

Returns FULL_TEXT 的部分值。

对于每个截断的字段:

SELECT LENGTH(full_text) FROM my_large_table WHERE ID = '50166cd8ed2266e0c8d15d9161477c3d636f193e873c4a97a6309cff237d8f0';
 
 length 
--------
   2048
(1 row)

当我尝试使用 tsql(FreeTDS 实用程序)select 相同的值时,它 returns 整个值,即使超过 20 KB 也不会被截断。

我还有另一个 PostgreSQL 服务器,具有类似的 table,有很长的文本记录。我尝试使用 postgres_fdw 连接到它,同样,没问题,没有截断。

有什么问题或需要检查的想法吗? 谢谢。

服务器设置: Debian 11.1 PostgreSQL 13.4-4.pgdg110+1 tds_fdw: 2.0.2-2.pgdg110+1 freetds-common:1.2.3-1 libsybdb5:amd64: 1.2.3-1

微软 SQL 服务器 2014 (SP2-CU14) (KB4459860) - 12.0.5600.1 (X64) 2018 年 9 月 27 日 21:47:31 版权所有 (c) 微软公司 Windows NT 6.3(内部版本 14393:)(管理程序)上的企业版(64 位)

Windows2016标准版

感谢@FlipperPA。 总之,我采取的解决方案是将/etc/freetds/freetds.conf或/var/lib/postgresql/.freetds.conf的“文本大小”参数设置为最大值(4294967295):

[global]
...
tds version = auto
...
text size = 4294967295
...

尚不完全清楚为什么需要这样做:FreeTDS 文档指出这已经是默认设置,并且 tsql 不会受到截断的影响。我也找不到 tds_fdw 比主文件更喜欢的任何其他 freetds.conf 文件。也许 tds_fdw 有自己的默认值,可以被 freetds.conf 覆盖。不管是什么解释,设置上面的参数是有效的。