mysql에서 table column max length 초과 할 때 대처법

mysql

위키피디아에는 이렇게 소개하고 있다
MySQL is an open-source relational database management system. Its name is a combination of "My", the name of co-founder Michael Widenius's daughter My, and "SQL", the acronym for Structured Query Language

mysql은 데이터 베이이스 관리 프로그램이다. 오픈 소스이고 널리 사용하는데다 오라클이 인수한 후에 꾸준히 관리도 잘 되고 있어서 점유율이 높은 프로그램이다.

우리나라에서는 대체로 마이에스큐엘이라고 하는 읽는데 영미권에선 마이씨퀄이라고 읽는 사람도 많다. 왜 그런가했더니 옛날에 SQL이란 걸 처음 만들 때 SEQUEL이라는 이름으로 부르려고 했었으나 전혀 다른 분야에서 이미 상표권 등록을 한 상태라 SQL로 이름을 붙이고 에스큐엘이라고 읽기로 했다고 한다. 따라서 mysql도 마이에스큐엘이라고 읽어주길 선호하는데, 부르기 편한대로 부르라고 한다.

local host

마이에스큐엘을 이용하면 집에 있는 컴퓨터를 서버처럼 이용할 수 있다. 그렇게 세팅하는 방법은 나중에 따로 정리하기로 하고, 여기서는 사용중에 나온 max length 문제 해결 과정을 남기려고 한다

max length

"message": "An exception is raised during the commit. This typically happens due to invalid data in the commit, e.g. exceeding max length. ",
이런 오류 메세지가 발생했다. 왜 그런지 재빨리 chatgpt에게 물어봤더니 이렇게 대답했다

 

The error message "Data too long for column 'value_json' at row 1" indicates that the data you're trying to store in a value_json column of your database exceeds the maximum length allowed for that column.

즉 내가 저장하려고 하는 column 'value_json'이 받을 수 있는 길이 보다 저장하고자 하는 정보의 길이가 더 길다는 거였다. 저장하고자 하는 정보는 numpy array 였기 때문에 충분히 그럴 수 있겠다 싶었다. 따로 찾아서 글자수를 세보니 4만 자가 넘었다. 그런데 그렇다고포기할 순 없었다. chatgpt가 바로 바로 대답을 내놓진 않았지만 결론적으로 2가지 해결책이 있었다.

 

  1. 배열을 압축해서 저장
  2. 칼럼 속성 변경

encode

첫번째 방법은 저장하고자 하는 정보를 만져서 mysql이 원하는 형태로 만들어주는 거다. 이 방법의 장점은 데이터베이스에 변경 권한이 없어도 진행할 수 있다는 점이다. 그러나 과정이 한번 더 생겨 번거롭고 나의 경우처럼 결국 압축을 해도 길이를 초과할 수 있다는 단점이 있다.

필요에 따라 여러 방법으로 할 수 있는데 핵심은 길이를 줄이기 위해 압축한다는 점이다. 아래는 chatgpt가 추천했던 zlib을 이용한 압축이다.

import zlib
import base64

compressed_data = zlib.compress(serialized_data.encode())  # Compress the JSON string
encoded_data = base64.b64encode(compressed_data).decode()  # Encode bytes to Base64 string

zlib으로 데이터를 이진 데이터로 만든다.
그러나 내 칼럼은 바이너리 데이터를 받을 수 없다. 따라서 base64로 다시 문자열로 만들어 줘야했다.

너무 지저분한 방법이었다. 실험해봤으나 어차피 길이를 초과했다. 그래서

alter

칼럼 속성을 변경하기로 했다. 나는 mysql로 내 컴퓨터에서 서버처럼 쓰고 있으니 칼럼 속성 변경은 코드 한줄이면 할 수 있다.

ALTER TABLE your_table_name
MODIFY COLUMN column_name new_data_type(new_length);

대략 이런 코드를 쓰면 된다

ALTER TABLE your_table_name
MODIFY COLUMN value_json VARCHAR(10000);

숫자면 이렇게 쓰거나

ALTER TABLE your_table_name MODIFY COLUMN value_json MEDIUMTEXT;

문자 text 면
TEXT: A TEXT column can hold up to 65,535 bytes of data, which includes text and any potential character encoding overhead.
MEDIUMTEXT: For larger text, a MEDIUMTEXT column can store up to 16,777,215 bytes.
LONGTEXT: The largest is LONGTEXT, with a maximum length of 4,294,967,295 bytes.
이 중에서 원하는 걸로 정해서 바꿔주면 된다.

이걸 하나하나 stackoverflow 돌아다니면서 찾지 않아도 되고. 참 chatgpt에 고마울 따름이다.