MySQL "Specified key was too long" Hatası

· PHP , Web , MySQL ·

MariaDB

Sitemin veritabanının yedeğini almıştım ve başka bir ortama taşımam gerekiyordu. Dosyaları taşıdım, veritabanını oluşturdum, SQL dump aldıktan sonra yeni sunucuya yükledim ki bu hata oluştu. (#1071 - Specified key was too long; max key length is 767 bytes)

Specified key was too long, max key length is 767 bytes

 

Bu hata büyük ihtimal ile Laravel uygulamalarınızda karşınıza çıkacak. Uzun uğraşlar sonucu sorunu çözdüm. İlk olarak halihazırdaki veritabanlarınız için çözümü sunacağım, ikinci yol olaraksa veritabanı oluşturulmamış Laravel uygulamalarınızda bu hata ile asla karşılaşmamanızı sağlayacağım. Test etmediğim ancak işe yaradığından bahsedilen üçüncü bir yol daha göstereceğim.

 

MySQL veya MariaDB sürümünü yükseltmek

Evet hatanın ilk çözümü bu. Sunucunuzdaki MySQL sürümü 5.7.7 ve altındaysa, MariaDB de 10.2.2 ve altındaysa bu hatayla karşılaşacaksınız. 

Güncelleme yapmak için örnek olarak CentOS 7.5 MariaDB 10.1'den 10.4'e nasıl güncelleyeceğinizi göstereceğim.

systemctl stop mysql

yum -y remove mariadb-server

sed -i 's|10.1|10.4|g' /etc/yum.repos.d/MariaDB.repo

yum -y install mariadb-server

systemctl start mysql

mysql_upgrade -u root -p 

komutlarını sırasıyla çalıştırdığımızda MariaDB güncellenecektir.

 

Laravel Framework defaultStringLength Düzenleme

Laravel'de Schema classına tanımlanmış varsayılan string uzunluğunu değiştirerek bu problemi çözebiliriz.

app/Providers/AppServiceProvider.php dosyasını düzenliyoruz.

use Illuminate\Support\Facades\Schema;

public function boot() {
    Schema::defaultStringLength(191);
}

eklemesini yaptığımızda bundan sonra projelerinizde problem çıkmayacaktır.

Hatanın oluşma sebebi Laravel varsayılan olarak emojileri de veritabanında saklayan utf8mb4 karakter setini kullandığı için bu karakter setinin ürettiği string uzunluklarını eski sürümler destekleyemeyebiliyor. Hatanın düzenlenmesi için AppServiceProviderınızda bu düzenlemeyi yaptıktan sonra tekrar migrate etmeniz gerekiyor.

 

innodb_large_prefix özelliğini etkinleştirmek

my.ini dosyanızı açıp aşağıdaki satırları içerisine ekleyin. Dosyanın konumu sisteminize göre değişiklik gösterebilir.

[mysqld]
innodb_file_format = Barracuda
innodb_large_prefix = 1
innodb_file_per_table = ON

 

Probleminiz çözülmediyse yorumlar bölümünde belirtebilirsiniz, yardımcı olmaya çalışacağım.