/ php

Laravel: Specified key was too long error

Từ phiên bản 5.4 của Laravel đã chuyển database character set mặc định là utf8mb4 để có thể hỗ trợ lưu trữ emojis. Nếu các dự án mới của bạn đang chạy MySQL v5.7.7 hoặc cao hơn thì bạn không cần làm gì nữa.

Ngược lại nếu dùng MariaDB hoặc các phiên bản cũ hơn của MySQL thì khi dùng lệnh php artisan migrate bạn sẽ thấy dòng lỗi như sau do chiều dài tối đa của một cột varchar của utf8mb4 chỉ 191 ký tự:

[Illuminate\Database\QueryException]
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table users add unique users_email_unique(email))

[PDOException]
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes

Đây là giới hạn (được Laravel tạo tự động) tạo là 255 ký tự cho varchar vượt qua 191 ký tự đối với các phiên bản MySQL cũ hoặc MariaDB. Để sửa lỗi này, bạn mở tập tin app\Provider\AppServiceProvider.php và thêm vào phương thức boot dòng sau để mở rộng giới hạn kiểu chuỗi:

use Illuminate\Support\Facades\Schema;
 
public function boot()
{
    Schema::defaultStringLength(191);
}

Bây giờ mọi thứ đã bình thường, hãy gõ lại xem nào.

Đinh Quốc Hân

Đinh Quốc Hân

Mình rất yêu thích việc lập trình web, đam mê việc nghiên cứu, tạo ra các sản phẩm có ích cho bản thân và cộng đồng

Read More
Laravel: Specified key was too long error
Share this

Subscribe to Dinh Quoc Han