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 VARYINGVARCHAR ,默认也是 255 但不填充空格。

以上是关于Laravel - 为啥使用尾随空格保存 CHAR 列?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 python pandas 数据框剥离方法不适用于尾随空格?我该如何解决?

在 IntelliJ IDEA 12 中保存时删除尾随空格

模型保存或更新时 Laravel 尾随数据异常

保存模型时的Laravel模型尾随数据[重复]

如何在 Matlab 中保存时自动删除尾随空格?

如何使用正则表达式删除尾随空格?