저는 PostgreSQL 데이터베이스에서 데이터를 가져오기 위해 쿼리 빌더 와 파일->연결 대상->ODBC->데이터베이스 테이블 열기를 사용해 왔습니다.
데이터베이스에서 가져온 테이블에는 긴 텍스트 문자열이 포함된 열이 있습니다.
텍스트 문자열의 길이가 524,587(2^19 -1)을 초과하면 잘립니다.
JMP 또는 JSL에서 더 큰 문자열 값을 쿼리할 수 있도록 변경할 수 있는 설정이 있습니까?
문제 발생 배경 및 디버깅 결과
저는 Torch 딥러닝 추가 기능의 기능을 살펴보고 있습니다.
저는 Kaggle에서 개 vs 늑대 데이터 세트를 다운로드했습니다.
저는 JMP의 "여러 파일 가져오기" 기능을 사용하여 이 모든 파일(2000개 파일)을 포함하는 데이터 테이블을 만들었습니다.
저는 JMP를 사용하여 데이터를 정리하고, 응답 열과 유효성 검사 열 등을 생성했습니다.
PostgreSQL 데이터베이스, 스키마 및 테이블을 생성했습니다.
JMP를 사용하여 데이터베이스 테이블에 연결하고, 개와 늑대 데이터를 연결한 다음, 해당 정보를 데이터베이스에 다시 저장했습니다. 그림 열은 `new image( char to blob("...이미지 정보...") )`를 사용하여 텍스트 형식으로 데이터베이스에 저장됩니다.
데이터베이스의 데이터를 검토했는데, 모든 것이 예상대로입니다.
저는 쿼리 빌더를 사용하여 데이터베이스에 연결하고 Dogs vs Wolves 테이블 전체를 쿼리했습니다.
이미지가 데이터 테이블에 표시되도록 하기 위해 Picture 열의 데이터 형식을 문자형에서 표현식으로 변환했습니다. 2,000개 항목 중 1,986개는 예상대로 표시되었지만 14개는 제대로 표시되지 않았습니다. 문제가 있는 항목에는 다음 이미지들이 포함됩니다.
- 늑대/늑대 이름-e1528831052890.jpg
- 늑대/늑대새끼.jpg
- 늑대/늑대-4191896__480.png
- 늑대/pexels-photo-682375.jpeg
- 늑대/pexels-photo-682361.jpeg
- 늑대/자연-동물-늑대-야생.jpg
- 늑대/michael-mazzone-xvLRLLfP22o-unsplash.jpg
- 늑대/영웅_회색_늑대_동물.jpg
- 늑대/회색늑대_썸네일JPG.jpg
- 늑대/회색늑대.jpg
- 늑대/겨울 늑대 눈_-_웨스트버지니아_-_숲의 방랑자.jpg
- 늑대/SRX_WOLF_TRAPPING1.JPG.jpg
- 늑대/유라시아_늑대JPG.jpg
- 개/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;
Open Database Table에서 생성된 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"
);
상황을 더 자세히 조사하기 위해 SQL 쿼리를 실행하고 결과를 pandas 데이터프레임에 저장하는 Python 스크립트를 작성했습니다. 그런 다음 이 Python 스크립트를 실행하고 pandas 데이터프레임을 JMP 데이터 테이블로 변환하는 JSL 파일을 만들었습니다.
파이썬 파일의 이름은 "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);
이 코드를 실행하면 데이터 테이블에 전체 텍스트 문자열이 포함됩니다. 하지만 Picture 열을 Expression 데이터 형식으로 변환하면 이미지가 올바르게 표시됩니다.
결론
JMP가 대용량 텍스트 문자열을 데이터베이스에 성공적으로 기록하고 있습니다.
JMP는 쿼리 빌더 및/또는 데이터베이스 테이블 열기를 사용하여 데이터베이스에서 쿼리할 때 긴 텍스트 문자열을 잘라냅니다.
JMP 외부에서 SQL 쿼리를 실행하면 데이터베이스에 저장된 전체 길이의 텍스트 문자열이 반환됩니다.
욕구
이미지 처리 프로젝트를 진행하면서 쿼리 빌더의 편리함을 활용하고 싶습니다.
질문
JMP 또는 JSL에서 더 큰 문자열 값을 쿼리할 수 있도록 변경할 수 있는 설정이 있습니까?
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 쿼리에 사용한 파이썬 코드를 작성하는 데 도움을 주었지만, PostgreSQL 데이터 커넥터를 사용하라고 권장한 적은 없습니다.
비록 제가 직접 파이썬 SQL 쿼리를 만들어서 해결할 수는 있었겠지만, 마치 바퀴를 재발명하는 것 같은 느낌이었고, 생각만큼 쉬운 방법은 아닐 것 같았습니다.
블록 가져오기 기능을 끄고 싶습니다.
Preferences(ODBC Disable Block Fetch(1))
ODBC 데이터 소스에 연결하기 전에 JSL을 사용합니다.
JMP는 ODBC 소스에서 데이터를 가져올 때 성능을 향상시키기 위해 블록 페칭을 사용합니다.
블록 페치는 데이터 소스에서 데이터를 읽을 때마다 한 줄씩 읽는 대신 N x N 크기의 연속된 메모리 블록에 데이터를 채워 넣는 방식입니다. 문자 데이터 양이 많을 경우 블록 크기 때문에 데이터가 잘릴 수 있습니다. 이 설정을 변경하면 JMP가 한 줄씩 읽어 전체 문자열을 가져옵니다.
추천해주신 방법을 시도해봤는데, 안타깝게도 효과가 없는 것 같습니다.
JSL 코드를 실행한 다음 파일 -> 연결 -> ODBC -> 데이터베이스 테이블 열기를 사용하여 테이블을 쿼리했습니다.
설정을 변경했음에도 불구하고 긴 텍스트 문자열이 여전히 524,287자로 잘리는 현상이 발생합니다.

네, 업데이트 감사합니다. 그리고 각 문자는 유니코드(UTF8) 문자라는 점도 기억해 주세요.
ODBC 드라이버가 크기를 알지 못하는 경우 JMP는 4MB를 사용합니다.
위시리스트를 업데이트해 주시겠어요?