我已經創建了幾個外部表,它們都可以正常作業,但是現在我必須處理一個表,該表的列在某些行中包含 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-common: 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) Microsoft Corporation Enterprise Edition(64 位),Windows NT 6.3(內部版本 14393:)(管理程式)
Windows 2016 標準版
uj5u.com熱心網友回復:
感謝@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 覆寫。無論解釋如何,設定上述引數都有效。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/335128.html
