본문 바로가기
Tips/Mysql

[Mysql] The used table type doesn't support BLOB/TEXT columns 에러 해결 방법

by Code Wizard 2023. 4. 4.

The used table type doesn't support BLOB/TEXT columns 에러 발생 쿼리

Mysql에서 아래와 같이 text를 가진 테이블을 생성하면 오류가 발생한다.

CREATE TABLE `sessions` (
  `session_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
  `expires` int unsigned NOT NULL,
  `data` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin,
  PRIMARY KEY (`session_id`)
) ENGINE=MEMORY DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

에러내용

위 쿼리 실행시 아래와 같이 오류가 발생하였으며 상세 내용은 다음과 같다.

SQL Error [1163] [42000]: The used table type doesn't support BLOB/TEXT columns

org.jkiss.dbeaver.model.sql.DBSQLException: SQL Error [1163] [42000]: The used table type doesn't support BLOB/TEXT columns
	at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCStatementImpl.executeStatement(JDBCStatementImpl.java:133)
	at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.executeStatement(SQLQueryJob.java:582)
	at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.lambda$1(SQLQueryJob.java:491)
	at org.jkiss.dbeaver.model.exec.DBExecUtils.tryExecuteRecover(DBExecUtils.java:173)
	at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.executeSingleQuery(SQLQueryJob.java:498)
	at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.extractData(SQLQueryJob.java:924)
	at org.jkiss.dbeaver.ui.editors.sql.SQLEditor$QueryResultsContainer.readData(SQLEditor.java:3842)
	at org.jkiss.dbeaver.ui.controls.resultset.ResultSetJobDataRead.lambda$0(ResultSetJobDataRead.java:123)
	at org.jkiss.dbeaver.model.exec.DBExecUtils.tryExecuteRecover(DBExecUtils.java:173)
	at org.jkiss.dbeaver.ui.controls.resultset.ResultSetJobDataRead.run(ResultSetJobDataRead.java:121)
	at org.jkiss.dbeaver.ui.controls.resultset.ResultSetViewer$ResultSetDataPumpJob.run(ResultSetViewer.java:5073)
	at org.jkiss.dbeaver.model.runtime.AbstractJob.run(AbstractJob.java:105)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
Caused by: java.sql.SQLSyntaxErrorException: The used table type doesn't support BLOB/TEXT columns
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)
	at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
	at com.mysql.cj.jdbc.StatementImpl.executeInternal(StatementImpl.java:763)
	at com.mysql.cj.jdbc.StatementImpl.execute(StatementImpl.java:648)
	at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCStatementImpl.execute(JDBCStatementImpl.java:329)
	at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCStatementImpl.lambda$0(JDBCStatementImpl.java:131)
	at org.jkiss.dbeaver.utils.SecurityManagerUtils.wrapDriverActions(SecurityManagerUtils.java:96)
	at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCStatementImpl.executeStatement(JDBCStatementImpl.java:131)
	... 12 more

에러 원인 및 해결방법

해당 오류는 ENGINE=MEMORY와 같이 메모리 기반의 테이블에서 TEXT나 BLOB 타입의 컬럼을 사용할 수 없기 때문에 발생하는 오류입니다.

해결방법은 아래와 같습니다.

1. 테이블 엔진 변경

해당 오류를 해결하기 위해서는 MEMORY 대신 InnoDB나 MyISAM 등의 디스크 기반의 엔진을 사용해야 합니다. 디스크 기반의 엔진에서는 TEXT나 BLOB 타입의 컬럼도 사용할 수 있습니다.

아래는 변경 예제입니다.

CREATE TABLE `sessions` (
  `session_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
  `expires` int unsigned NOT NULL,
  `data` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin,
  PRIMARY KEY (`session_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

참고로, InnoDB 엔진은 대부분의 경우에 MyISAM 엔진보다 안정적이고 성능이 우수하기 때문에 InnoDB 엔진을 사용하는 것이 좋습니다.

2. TEXT나 BLOB 타입 대신 VARCHAR 타입 사용

메모리 기반의 테이블에서는 TEXT나 BLOB 타입의 컬럼을 사용할 수 없지만 VARCHAR 타입의 컬럼은 사용할 수 있습니다. 따라서 컬럼 타입을 VARCHAR로 변경하여 사용할 수 있습니다.

아래는 변경 예제입니다.

CREATE TABLE 세션(
session_id varchar(128) 문자 세트 utf8mb4 COLLATE utf8mb4_bin NOT NULL,
expires int unsigned NOT NULL,
data VARCHAR(65535) 문자 세트 utf8mb4 COLLATE utf8mb4_bin,
기본 키(session_id)
) ENGINE=MEMORY DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

참고사항

데이터베이스의 기본 엔진을 innodb로 변경해 두면 ENGINE을 명시하지 않아도 해당 엔진방법으로 생성됩니다.

아래는 설정 명령어입니다.

mysql> SET GLOBAL default_storage_engine = 'InnoDB';

혹은 아래와 같이 Mysql 설정을 변경해도 됩니다.

MySQL의 설정 파일인 my.cnf 파일에서 default-storage-engine 옵션을 수정합니다. 이 옵션은 새로운 테이블이 생성될 때 사용될 기본 엔진을 설정합니다.

[mysqld]
default-storage-engine = innodb

결론

테이블 생성시 두번째방법보다는 첫번째 방법으로 innodb를 엔진으로 하는 테이블을 생성하는것이 좋습니다.

 VARCHAR(65535)는 해당 크기가 넘어간다면 저장하지 못하기 때문입니다.

위 쿼리는 테이블 스페이스 엔진 방식과 상관없이 테이블 생성문에 엔진 타입이 정해져 있기때문에  

해당 테이블은 해당 엔진 방식으로 생성됩니다.

TEXT를 포함하는 테이블은 innodb 엔진으로 생성하는것을 추천드립니다.