【问题标题】: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 列的长度,但为什么我不设置它会添加空格?

我已阅读 charstring 函数的文档,但找不到解释。

我正在使用 Laravel 6。

【问题讨论】:

    标签: laravel eloquent 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(我找不到类似的情况),但它也可能是您的数据库实例上的设置。

    相关源码:

    【讨论】:

    • 感谢您的帮助。我使用 PostgreSQL,根据您的解释,我能够更好地搜索。这是Character Types 之间的区别。 ->char 被创建为 CHARACTER ,它具有 FIXED LENGTH,正如您所说,默认值为 255,并用空格填充。最后 ->string 创建为 CHARACTER VARYINGVARCHAR ,默认也是 255 但不填充空格。
    猜你喜欢
    • 2015-11-15
    • 2010-12-17
    • 2020-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 2021-04-08
    • 2015-05-30
    相关资源
    最近更新 更多