Ошибка: #1071 - указанный ключ был слишком длинным; максимальная длина ключа 1000 байтов - mysql 5.0.91
Я использую mysql 5.0.91 и мне нужно сохранить URL-адреса (некоторые из них маленькие, а некоторые очень длинные). Я хочу использовать varchar(2000)
но я получаю ошибку:
# 1071 - Указанный ключ был слишком длинным; максимальная длина ключа 1000 байтов
Каков наилучший способ сохранить URL-адреса на моем хостинге с помощью mysql 5.0.91?
4 ответа
Ты используешь unique=True
в вашем столбце URL? MySQL строит уникальный индекс для этого столбца, и количество байтов, которое он использует на символ, зависит от кодировки.
Например, если это UTF-16, он будет использовать 2 байта на символ, поэтому ваш varchar(2000)
столбец будет 4000 байтов, и, как говорится в сообщении об ошибке, максимальная длина ключа составляет 1000 байтов.
Таким образом, вы можете переключиться на UTF-8 и использовать varchar(900)
вместо этого, чтобы решить эту проблему.
Laravel по умолчанию использует набор символов utf8mb4, который включает в себя поддержку хранения "emojis" в базе данных. Если вы используете версию MySQL, более раннюю, чем версия 5.7.7, или MariaDB старше, чем версия 10.2.2, вам может потребоваться вручную настроить длину строки по умолчанию, создаваемую миграциями, чтобы MySQL создавал для них индексы. Вы можете настроить это, вызвав метод Schema::defaultStringLength в вашем AppServiceProvider:
use Illuminate\Support\Facades\Schema;
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Schema::defaultStringLength(191);
}
Перепишите ваше поле электронной почты как:
$table->string('email', 250)->unique();
Я запустил эту ошибку, потому что я выбрал сортировку utf-16 в db - переключился обратно на utf-8 general-ci - и она исчезла.