【发布时间】:2021-12-09 02:12:30
【问题描述】:
我已经创建了几个外部表,它们都可以正常工作,但现在我必须处理一个表,该表的某些行中包含 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;
返回 FULL_TEXT 的部分值。
对于每个截断的字段:
SELECT LENGTH(full_text) FROM my_large_table WHERE ID = '50166cd8ed2266e0c8d15d9161477c3d636f193e873c4a97a6309cff237d8f0';
length
--------
2048
(1 row)
当我尝试使用 tsql(FreeTDS 实用程序)选择相同的值时,它会返回整个值,即使超过 20 KB 也不会截断。
我还有另一个 PostgreSQL 服务器,它有一个类似的表,有很长的文本记录。我尝试使用 postgres_fdw 连接到它,同样,没问题,没有截断。
有什么想法可能是错误的或需要检查什么吗? 谢谢。
服务器设置: Debian 11.1 PostgreSQL 13.4-4.pgdg110+1 tds_fdw:2.0.2-2.pgdg110+1 freetds 通用:1.2.3-1 libsybdb5:amd64: 1.2.3-1
Microsoft SQL Server 2014 (SP2-CU14) (KB4459860) - 12.0.5600.1 (X64) 2018 年 9 月 27 日 21:47:31 版权所有 (c) 微软公司 Windows NT 6.3(内部版本 14393:)(管理程序)上的企业版(64 位)
Windows 2016 标准版
【问题讨论】:
-
你能检查一下
text size在你的 FreeTDS 设置中为 FDW 设置了什么吗?我已经看到这与以前的主要 FreeTDS 设置不同。 freetds.org/userguide/freetdsconf.html -
@FlipperPA 感谢您提出覆盖 FreeTDS 设置的想法。我仍然找不到在哪里,但创建一个明确声明默认“文本大小 = 4294967295”的 /var/lib/postgresql/.freetds.conf 文件最终允许我选择全文。当然,在哪里覆盖了默认的 FreeTDS 设置仍然是一个问题。
标签: sql-server postgresql freetds