我一直使用查询生成器和文件->连接到->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。
可以更新一下愿望清单吗?