Laravel 의 BluePrint 를 수정해서 Oracle 의 NVARCHAR 2 사용하기

개요

Laravel 의 DB Migration 기능을 사용할 경우 string() 함수를 사용하면 DBMS 의 VARCHAR 타입으로 생성이 됩니다.


즉 아래 소스는 name 이라는 20 byte 짜리 VARCHAR 컬럼을 만들게 됩니다.

public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name', 20);           
            $table->timestamps();
        });
    }


만약 DBMS 를 사용한다면 VARCHAR2는 byte 단위로 문자를 처리해서 한글과 영어에 따라 입력할 수 있는 단어 길이가 달라지게 됩니다.


이럴 경우 yajra/laravel-oci8 패키지에서 제공하는 nvarchar2() 함수를  string() 함수대신 사용하면 됩니다. 

public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->nvarchar2('name', 20);           
            $table->timestamps();
        });
    }


타 DB와 호환성 확보하기

만약 운영은 Oracle 을 사용하고 로컬 개발은 MySQL 을 사용하거나 laravel 로 만든 솔루션을 타 DBMS 환경에서 구동해야 한다면 MySQL 용 BluePrint 클래스에는 nvarchar2() 함수가 없으므로  migration 에 실패하게 됩니다.


이를 해결하려면 Illuminate\Database\Schema\Blueprint 클래스에 다음과 같이 nvarchar2() 를 추가해 주면 됩니다.

	public function string($column, $length = null)
    {
        $length = $length ?: Builder::$defaultStringLength;

        return $this->addColumn('string', $column, compact('length'));
    }
	
	// 추가
    public function nvarchar2($column, $length = null)
    {
        return $this->string($column, $length);
    }



같이 보기