[MySQL] TypeORM String 타입 사용 시 문자열 길이 제한 변경

DB를 기존에 사용하던 PostgreSQL에서 MySQL로 변경하고 나서 동일한 Entity의 String 타입으로 지정된 칼럼의 문자열 길이가 공백 포함 255자 이상은 저장되지 않는 이슈가 생겼다.

 

기존 Entity는 Id, 생성 일시, 마지막 업데이트 일시, 제목, 설명, 썸네일, 링크로 구성되어 있는데 이슈가 발생한 부분은 description 부분이었다. TypeORM의 경우, string 타입으로 칼럼 타입을 지정하면 각 DB의 기본 문자열 저장 타입으로 변환하는데 따로 Character Type을 지정하지 않으면 PostgreSQL은 varchar, MySQL은 varchar(255)이다.

 

// content.entity.ts
@Entity()
export class Content {
    @PrimaryGeneratedColumn()
    id: number;
    
    @CreateDateColumn()
    createdAt: Date;
    
    @UpdateDateColumn()
    updatedAt: Date;
    
    @Column()
    title: string;

    @Column()
    description: string;

    @Column()
    thumbnail: string;

    @Column()
    link: string;
}

해당 Entity를 PostgreSQL에서 사용했을 때는 이슈가 없다가 MySQL에서 이슈가 발생한 이유이자 TypeORM 사용 시, 두 RDBMS의 차이점은 PostgreSQL의 경우, 기본적으로 varchar 타입의 최대 길이가  65,535 bytes 이지만, MySQL의 경우 varchar(255)로 255 bytes 까지만 저장이 가능하다는 것이다.

 

해당 Entity 파일에서 description 칼럼의 @Column() 어노테이션에 varchar 보다 최대 byte가 더 큰 MySQL 데이터 타입(text(64KiB), medium text(16MiB), long text(4GiB))를 지정하여 문자열 길이 이슈의 해결이 가능하다.

@Column('longtext') // description의 칼럼 타입을 long text로 변경한다.
description: string;

 
참고 글) https://kimbriggs.com/computer/mysql-data-types

 

MySQL Data Types Quick Reference Table - V5.0 - kimbriggs.com

The MySQL data-types table in Open Document format (much better for printing). Type {storage} Name Range Attributes Default Numeric{1 byte} TINYINT[(M)] -128 TO 127 [0 to 255 if UNSIGNED] AUTO_INCREMENT UNSIGNED, ZEROFILL,SERIAL DEFAULT VALUE NULL [0 if

kimbriggs.com