MySQL "Specified key was too long" Hatası
#Laravel, #MySQL, #MariaDB, #defaultStringLength, #max key length is 767 bytes, #specified key was too longSitemin 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)
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.