我使用的是mysql 5.0.91,我需要保存URL(有些很小,有些很长) . 我想使用 varchar(2000) 但是我收到一个错误:
varchar(2000)
#1071 - 指定密钥太长;最大密钥长度为1000字节
使用mysql 5.0.91在我的主机上保存URL的最佳方法是什么?
你在你的网址栏上使用了 unique=True 吗? MySQL正在该列上构建一个唯一索引,并且每个字符使用的字节数因编码而异 .
unique=True
例如,如果它是UTF-16,则每个字符将使用2个字节,因此 varchar(2000) 列将为4000个字节,并且如错误消息所示,最大密钥长度为1000个字节 .
因此,您可以切换到UTF-8并使用 varchar(900) 来解决此问题 .
varchar(900)
我跑了那个错误,因为我在db中选择utf-16校对 - 切换回utf-8 general-ci - 它已经消失了 .
重写您的电子邮件字段,如:
$table->string('email', 250)->unique();
Laravel默认使用utf8mb4字符集,其中包括支持在数据库中存储"emojis" . 如果您运行的是早于5.7.7版本的MySQL版本或早于10.2.2版本的MariaDB,您可能需要手动配置迁移生成的默认字符串长度,以便MySQL为它们创建索引 . 您可以通过调用 AppServiceProvider 中的 Schema::defaultStringLength 方法来配置:
use Illuminate\Support\Facades\Schema; /** * Bootstrap any application services. * * @return void */ public function boot() { Schema::defaultStringLength(191); }
4 回答
你在你的网址栏上使用了
unique=True
吗? MySQL正在该列上构建一个唯一索引,并且每个字符使用的字节数因编码而异 .例如,如果它是UTF-16,则每个字符将使用2个字节,因此
varchar(2000)
列将为4000个字节,并且如错误消息所示,最大密钥长度为1000个字节 .因此,您可以切换到UTF-8并使用
varchar(900)
来解决此问题 .我跑了那个错误,因为我在db中选择utf-16校对 - 切换回utf-8 general-ci - 它已经消失了 .
重写您的电子邮件字段,如:
Laravel默认使用utf8mb4字符集,其中包括支持在数据库中存储"emojis" . 如果您运行的是早于5.7.7版本的MySQL版本或早于10.2.2版本的MariaDB,您可能需要手动配置迁移生成的默认字符串长度,以便MySQL为它们创建索引 . 您可以通过调用 AppServiceProvider 中的 Schema::defaultStringLength 方法来配置: