Error “Illegal mix of collations” dapat terjadi pada aplikasi Laravel ketika terjadi pembandingan string dengan karakter set atau collation yang berbeda pada query SQL. Pada blog ini, Anda akan belajar bagaimana cara mengatasi error ini pada aplikasi Laravel. Kami akan membahas tentang cara menentukan collation secara eksplisit pada kelas model, sehingga dapat menghindari pembandingan string dengan collation yang berbeda pada query SQL. Selain itu, kami juga akan memberikan contoh pengaturan koneksi database di Laravel, yang dapat membantu Anda menghindari error “Illegal mix of collations”. Dengan membaca blog ini, Anda akan dapat mengatasi error “Illegal mix of collations” pada aplikasi Laravel Anda dan meningkatkan kualitas aplikasi Anda secara keseluruhan.
Sample Error yang dahulu pernah saya alami:
LARAVEL SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (utf8mb4_0900_ai_ci,COERCIBLE) and (utf8mb4_unicode_ci,COERCIBLE) for operation '=' (SQL: select * from `v_mobile_func_03_sk` where `AUFNR` = 210200011055 and `BATCH` = 31000009640123456789 and `LOCAL_SHIFT` = Shift 1 and `MESIN` = J0241)
Cek Config Database
'prod' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
Rubah ke
'prod' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_0900_ai_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
Konfigurasi di atas merupakan contoh pengaturan koneksi database di Laravel, yang berada di dalam file config/database.php
. Konfigurasi ini ditujukan untuk lingkungan produksi (production).
Penjelasan konfigurasi ini sebagai berikut:
'driver' => 'mysql'
: menentukan jenis database yang digunakan, dalam hal ini adalah MySQL.'url' => env('DATABASE_URL')
: menentukan URL database yang akan digunakan.'host' => env('DB_HOST', '127.0.0.1')
: menentukan host database yang digunakan. Nilai default adalah127.0.0.1
.'port' => env('DB_PORT', '3306')
: menentukan port database yang digunakan. Nilai default adalah3306
.'database' => env('DB_DATABASE', 'forge')
: menentukan nama database yang digunakan. Nilai default adalahforge
.'username' => env('DB_USERNAME', 'forge')
: menentukan username database yang digunakan. Nilai default adalahforge
.'password' => env('DB_PASSWORD', '')
: menentukan password database yang digunakan. Nilai default adalah string kosong.'unix_socket' => env('DB_SOCKET', '')
: menentukan path untuk UNIX socket yang digunakan dalam koneksi database.'charset' => 'utf8mb4'
: menentukan charset yang digunakan dalam koneksi database. Charset ini adalahutf8mb4
.'collation' => 'utf8mb4_0900_ai_ci'
: menentukan collation yang digunakan dalam koneksi database. Collation ini adalahutf8mb4_0900_ai_ci
.'prefix' => ''
: menentukan prefix tabel yang digunakan dalam koneksi database.'prefix_indexes' => true
: menentukan apakah prefix juga digunakan pada nama indeks tabel.'strict' => true
: menentukan apakah mode strict diaktifkan dalam koneksi database.'engine' => null
: menentukan engine database yang digunakan.'options' => extension_loaded('pdo_mysql') ? array_filter([PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA')]) : []
: menentukan opsi tambahan yang digunakan dalam koneksi database, seperti SSL CA pada koneksi database MySQL.
Semoga Membantu