(라라벨+MSSQL) 너무 긴 text 자료가 쿼리 결과에서 애초에 잘려 나오는 문제

엽토군·2021년 3월 19일
1

1분 코드 스니펫

목록 보기
4/9

tl;dr

다음 쿼리의 content에 사실은 데이터가 더 있는데 그게 잘려서 나온다면:

$sql = $pdo->prepare("SELECT content FROM foo WHERE bar = 'dee'");
$sql->execute();
var_dump($sql->fetchAll(\PDO::FETCH_OBJ));

다음과 같이 처리한다.

ini_set('mssql.textlimit', '2147483647');
ini_set('mssql.textsize', '2147483647');

$pdo->exec('SET TEXTSIZE 2147483647;');
$sql = $pdo->prepare("SELECT content FROM foo WHERE bar = 'dee'");
// 생략

사연

여전히 답 없이 돌아가는 우리 회사.. 사업팀은 네이버 블로그에 작성했던 알록달록한 홍보글을 그대로 복사해서 공식사이트 공지사항에도 쓰고 싶어한다. 물론 그 안에는 다음과 같은 아무짝에도 쓸모없는 HTML 태그들도 방실방실 웃으면서 포함돼 들어와 있다.

<span class="se-fs-fs16 se-ff-system  se-style-unset " id="SE-2af68e91-3b2d-448d-947b-c0684e8f9d82" style="margin: 0px; padding: 0px; border: 0px; font-variant: inherit; font-weight: inherit; font-stretch: inherit; font-size: 16px; line-height: inherit; font-family: HelveticaNeue, &quot;Helvetica Neue&quot;, helvetica, AppleSDGothicNeo, arial, &quot;malgun gothic&quot;, &quot;맑은  고딕&quot;, sans-serif, Meiryo; vertical-align: baseline;"></span>

마음 같아서는 다 발라내버린 다음 마크다운 에디터 쓰라고 강제하고 싶지만.. 행여나 사업팀에서 뭐라고 할까봐 그렇게는 못하겠고 그냥 붙여넣기 가능하도록 위지윅을 제공하고 있다.

그랬더니.. 공지사항이 잘린다. 에이 설마 하고 var_dump()를 찍어봐도 마찬가지다.

string(4096) "(중간 생략) erit; font-size: 12px; line-height: inherit; font-family: &quot;Apple SD Gothic Neo&quot;, &quot;맑은 고딕&quot;, &quot;Malgun Gothic&quot;, 돋움, dotum, sans-serif; vertical-align: baseline; position: relative; color: rgb(0, 0, 0); text-align: center;"><div class="se-component-content se-component-content-fit" style="margin: 0px auto; padding: 0px; border: 0px; font: inherit; vertical-align: baseline; max-width: 800px;"><div cla"

왜 이러는 거냐???

longtext형이라고 해도 기본값이란 건 있어야 하는 법이다. MSSQL의 경우 php.ini에서 odbc.defaultlrl 설정을 안 해주면 기본적으로 그 값이 4096이 되는 모양이다.
뭐? 그걸로는 턱도 없지! 내가 지금 뿌려야 하는 텍스트는 네이버 스마트에디터가 무책임하게 만들어놓은 HTML 마크업 문자열이며 그 크기가 족히 188kb(!!!)에 달하는데 말이다.

하긴 DB 입장에서는 이해 못할 바도 아니다. 이렇게 큰 텍스트 자료를 왜 파일로 떨구지 않고 인덱싱과 정렬과 검색이 가능한 하나의 자료로서 DB에 저장해놓고 쓰려고 드느냐 이거지. 지금껏 잘 쓰고 있던 DBeaver가 이 컬럼 데이터 미리보기를 시키면 무조건 크래시를 일으키는데... 그것만 보아도 이게 얼마나 수상쩍은 사태인지 알 수가 있다.

사실 이건 위지윅 에디터가 잘못이다. 고객의 텍스트를 직접 입력받는 입장이면 최소한의 thresholding은 해 줘야지 말이다. 위에 첨부한 span 태그 같은 innerText가 전혀 없는 노드 정도는 검출해서 날려줘도 되지 않을까 싶은데 말이다. 그걸 에라 모르겠다고 입력받은 그대로 올리니 이모양 이꼴이 나는 것이다.

아무튼 백방으로 검색해서 겨우 답을 찾았고 적용을 했더니 일단 되긴 된다.

교훈

  • 사용자들에게 textarea를 줄 때는, 사용자들이 거기에 100KB 이상의 글을 적어넣을 수도 있다는 걸 한번쯤은 되새겨 보자.
  • 너무 긴 텍스트라면 과감하게 파일로 떨구는 방안을 진지하게 고려해 보자.
profile
4년차 PHP 개발자입니다.

0개의 댓글