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); }