Laravel - 为啥使用尾随空格保存 CHAR 列?
Posted
技术标签:
【中文标题】Laravel - 为啥使用尾随空格保存 CHAR 列?【英文标题】:Laravel - Why a CHAR column is being saved with trailing whitespace?Laravel - 为什么使用尾随空格保存 CHAR 列? 【发布时间】:2021-09-08 07:41:23 【问题描述】:这是我在迁移文件中的up()
方法:
public function up()
Schema::table('users', function (Blueprint $table)
$table->char('rank')->nullable();
);
users
表已经存在,我正在添加这个 char 列。
在控制器和刀片中,我只用 1 个字符设置了值。
示例:我在控制器上设置$user->value = 'A';
并保存模型。然后,我尝试用 ` "Rank:" 显示该值。 $用户->价值。 “!!!” 在刀片上,它显示如下:
Rank: A !!!
为了解决这个问题,我在up()
方法中将char
的长度设置为1:
public function up()
Schema::table('users', function (Blueprint $table)
$table->char('rank',1)->nullable();
);
另外,如果我使用$table->string('rank')
创建列,它也不会添加空格。
我可以理解为什么我必须设置 char 列的长度,但为什么我不设置它会添加空格?
我已阅读 char 和 string 函数的文档,但找不到解释。
我正在使用 Laravel 6。
【问题讨论】:
【参考方案1】:来自 mysql documentation(我的粗体字):
CHAR 列的长度固定为您在创建表时声明的长度。长度可以是 0 到 255 之间的任何值。当存储 CHAR 值时,它们用空格右填充到指定长度。检索 CHAR 值时,除非启用 PAD_CHAR_TO_FULL_LENGTH SQL 模式,否则将删除尾随空格。
Laravel 的默认值是完整的 255,所以除非你指定大小为 1,否则它将用空格填充重置。
这并不能回答为什么在检索最后一行时它们没有被删除。我会看看 Laravel 是否在使用 PAD_CHAR_TO_FULL_LENGTH
(我找不到类似的情况),但它也可能是您的数据库实例上的设置。
相关源码:
char
blueprint method
default value for char length
【讨论】:
感谢您的帮助。我使用 PostgreSQL,根据您的解释,我能够更好地搜索。这是Character Types 之间的区别。->char
被创建为 CHARACTER
,它具有 FIXED LENGTH,正如您所说,默认值为 255,并用空格填充。最后 ->string
创建为 CHARACTER VARYING
或 VARCHAR
,默认也是 255 但不填充空格。以上是关于Laravel - 为啥使用尾随空格保存 CHAR 列?的主要内容,如果未能解决你的问题,请参考以下文章