我一直使用查詢產生器和文件->連接到->ODBC->打開資料庫表來從PostgreSQL資料庫中獲取資料。
我從資料庫中取得的表格包含一列,其中包含大量文字字串。
我的文字字串長度超過 524,587 時會被截斷。 (2^19 -1)
JMP 和/或 JSL 中是否有可以更改的設置,以允許查詢更大的字串值?
動機情境和調試結果
我一直在探索Torch 深度學習插件的功能。
我從 Kaggle 下載了一個關於狗與狼的資料集。
我使用 JMP 的「匯入多個檔案」功能建立了一個包含所有這些檔案(2000 個檔案)的資料表。
我使用 JMP 清理數據,創建回應列、驗證列等等…
我創建了一個PostgreSQL資料庫、模式和表。
我使用 JMP 連接到資料庫表,將我的「狗與狼」資料連接起來,並將資訊保存回資料庫。圖片列使用`new image( char to blob("...圖片資訊...") )`以文字形式儲存到資料庫中。
我已經查看了資料庫中的數據,一切似乎都符合預期。
我使用查詢產生器連接到我的資料庫,並查詢整個 Dogs vs Wolves 表。
我將「圖片」列的資料類型從字元型轉換為表達式型,以便圖片能在資料表中顯示。在 2000 筆記錄中,有 1986 筆顯示正常,但有 14 張圖片顯示不正確。這些圖片包括以下幾張:
- 狼/狼名-e1528831052890.jpg
- 狼/小狼.jpg
- 狼/wolf-4191896__480.png
- 狼/pexels-photo-682375.jpeg
- 狼/pexels-photo-682361.jpeg
- 狼/自然動物-狼-荒野.jpg
- 狼/michael-mazzone-xvLRLLfP22o-unsplash.jpg
- 狼/hero_gray_wolf_animals.jpg
- 狼/灰狼_thumbJPG.jpg
- 狼/灰狼.jpg
- 狼/冬狼雪景_-_西維吉尼亞_-_森林漫遊.jpg
- 狼/SRX_WOLF_TRAPPING1.JPG.jpg
- 狼/歐亞狼JPG.jpg
- dogs/n02106382_3756.jpg

我已檢查圖片訊息,發現存在問題的行缺少部分資訊。條目在圖片資訊中間部分就中斷了。
我檢查了圖片資訊的長度,發現所有損壞的圖片字元長度都恰好為 524,287。 (2^19 - 1)。

我嘗試修改查詢產生器建立的 JSL 參數,但仍然無法解決文字長度截斷的問題。我不是 SQL 專家,所以希望修改這些設定能夠解決我的問題。
New SQL Query(
Connection(
"
ODBC:AB=0;
BATCHSIZE=100;
BI=0;
BOOLSASCHAR=0;
BYTEAASLONGVARBINARY=1;
COMMLOG=2;
CONNSETTINGS=;
D6=-101;
DEBUG=2;
DRIVER={PostgreSQL Unicode(x64)};
EXTRASYSTABLEPREFIXES=;
FAKEOIDINDEX=0;
FETCH=100;
FETCHREFCURSORS=0;
IGNORETIMEOUT=0;
KEEPALIVEINTERVAL=-1;
KEEPALIVETIME=-1;
LFCONVERSION=1;
LOWERCASEIDENTIFIER=0;
MAXLONGVARCHARSIZE=8092;
MAXVARCHARSIZE=255;
OPTIONALERRORS=0;
PARSE=0;
PQOPT=;
PROTOCOL=7.4;
READONLY=0;
ROWVERSIONING=0;
SHOWOIDCOLUMN=0;
SHOWSYSTEMTABLES=0;
SSLMODE=disable;
TEXTASLONGVARCHAR=0;
TRUEISMINUS1=0;
UNIQUEINDEX=1;
UNKNOWNSASLONGVARCHAR=0;
UNKNOWNSIZES=0;
UPDATABLECURSORS=1;
USEDECLAREFETCH=1;
USESERVERSIDEPREPARE=1;
XAOPT=1;
"
),
QueryName( "dogs_v_wolves" ),
Select(
Distinct,
Column( "Picture", "t1" ),
Column( "Label", "t1" ),
Column( "File Path", "t1" ),
Column( "Short File Name", "t1" ),
Column( "FoldA", "t1" ),
Column( "FoldB", "t1" ),
Column( "FoldC", "t1" ),
Column( "Validation", "t1" )
),
From( Table( "dogs_v_wolves", Schema( "dogs_v_wolves" ), Alias( "t1" ) ) )
) << Run;
我嘗試修改「開啟資料庫表」所建立的 JSL 參數,但未能解決文字長度截斷的問題。再次說明,我並非 SQL 專家,所以我希望修改這些設定能夠解決我的問題。
Open Database(
"
AB=0;
BATCHSIZE=100;
BI=0;
BOOLSASCHAR=0;
BYTEAASLONGVARBINARY=1;
COMMLOG=2;
CONNSETTINGS=;
D6=-101;
DEBUG=2;
DRIVER={PostgreSQL Unicode(x64)};
EXTRASYSTABLEPREFIXES=;
FAKEOIDINDEX=0;
FETCH=100;
FETCHREFCURSORS=0;
IGNORETIMEOUT=0;
KEEPALIVEINTERVAL=-1;
KEEPALIVETIME=-1;
LFCONVERSION=1;
LOWERCASEIDENTIFIER=0;
MAXLONGVARCHARSIZE=8092;
MAXVARCHARSIZE=255;
OPTIONALERRORS=0;
PARSE=0;
PQOPT=;
PROTOCOL=7.4;
READONLY=0;
ROWVERSIONING=0;
SHOWOIDCOLUMN=0;
SHOWSYSTEMTABLES=0;
SSLMODE=disable;
TEXTASLONGVARCHAR=0;
TRUEISMINUS1=0;
UNIQUEINDEX=1;
UNKNOWNSASLONGVARCHAR=0;
UNKNOWNSIZES=0;
UPDATABLECURSORS=1;
USEDECLAREFETCH=1;
USESERVERSIDEPREPARE=1;
XAOPT=1;
",
"SELECT * FROM dogs_v_wolves.dogs_v_wolves"
);
為了進一步調查情況,我編寫了一個 Python 腳本,該腳本執行 SQL 查詢並將結果儲存到 pandas 資料框中。然後,我創建了一個 JSL 文件,該文件運行 Python 腳本並將 pandas 資料框轉換為 JMP 資料表。
該Python檔名為“sqlQuery.py”,內容如下:
import pandas as pd
import sqlalchemy as db
engine = db.create_engine("postgresql+psycopg2://##connection information##")
query = """
SELECT DISTINCT *
FROM dogs_v_wolves.dogs_v_wolves;
"""
df = pd.read_sql_query(query, engine)
JSL 檔案包含:
Names Default To Here( 1 );
pythonFilePath = "sqlQuery.py";
Python Submit File( pythonFilePath );
dt = python get(df);
dt:Picture << set data type(expression);
運行這段程式碼後,資料表中顯示的是完整的文字字串。當我將「圖片」列轉換為「表達式」資料類型後,圖片就能正確顯示了。
結論
JMP 正在成功地將大型文字字串寫入資料庫。
在使用查詢產生器和/或開啟資料庫表查詢資料庫時,JMP 會截斷較大的文字字串。
在 JMP 之外執行 SQL 查詢會傳回儲存在資料庫中的完整文字字串。
慾望
我希望在進行影像處理專案時能夠利用查詢建構器的便利性。
問題
JMP 和/或 JSL 中是否有可以更改的設置,以允許查詢更大的字串值?
我之前沒有嘗試過PostgreSQL資料連接器,我一直使用的是內建的ODBC連線。
根據您的建議,我嘗試了 PostgreSQL 資料連接器,並且可以確認這種方法解決了長文字截斷問題。
我知道應該有簡單的解決方法,但我自己找不到。
謝謝你的指導。
ODBC或許可以解決這個問題,但可能需要進一步研究,因為我估計這些因素會影響你所獲得的數據。
MAXLONGVARCHARSIZE=8092;
MAXVARCHARSIZE=255;
TEXTASLONGVARCHAR=0;
它們顯然與您的 524287 不匹配,因此它很可能在其他地方被覆蓋(但對於您的使用情況來說仍然太小)。
@briancorcoran
我就是在這裡卡住了。我太關注諸如此類的參數了:
BOOLSASCHAR=0;
BYTEAASLONGVARBINARY=1;
MAXLONGVARCHARSIZE=8092;
MAXVARCHARSIZE=255;
TEXTASLONGVARCHAR=0;
UNKNOWNSASLONGVARCHAR=0;
UNKNOWNSIZES=0;
即使 ChatGPT 和 Claude 都嘗試幫忙,我仍然找不到影響文字字串長度限制的參數。我嘗試了 AI 推薦的許多設定組合。
ChatGPT 確實幫助我創建了我在最初帖子中提供的基本 SQL 查詢所使用的 Python 程式碼,但它從未建議使用PostgreSQL 資料連接器。
雖然我可以用自己的 Python SQL 查詢完成這項任務,但這感覺就像在重新發明輪子,而且永遠不會像它應該的那樣簡單。
你想關閉區塊獲取功能
Preferences(ODBC Disable Block Fetch(1))
在連接到 ODBC 資料來源之前使用 JSL。
JMP 使用區塊提取來提高從 ODBC 來源匯入資料時的效能。
區塊讀取是指每次從資料來源讀取資料時,都會填入一個 N x N 的連續記憶體區塊,而不是逐行讀取。對於大量字元數據,由於區塊的大小限制,資料會被截斷。啟用此選項後,JMP 將逐行讀取並取得整個字串。
我嘗試了這個建議,但很遺憾,似乎沒有效果。
我運行了jsl程式碼,然後使用“檔案”->“連接到”->“ODBC”->“開啟資料庫表”查詢了我的表。
儘管更改了偏好設置,但我仍然會遇到長文本字串被截斷為524,287 個字元的情況。

好的,謝謝你的更新。另外請記住,每個字元都是一個Unicode字元(UTF-8)。
如果 ODBC 驅動程式不知道大小,JMP 將使用 4MB。
可以更新一下願望清單嗎?