【问题标题】:Store value type as a database column in MySQL在 MySQL 中将值类型存储为数据库列
【发布时间】:2020-09-29 18:19:58
【问题描述】:

我认为,我需要的是很常见的。我想使用 MySQL 创建一个 global_variables 表来存储我在整个 Web 应用程序中需要的一些变量。问题是每个变量都有多种类型之一(int、float、string、BLOB 等)。所以我需要能够使用idprogram_namevalue_typevalue 等列创建表,其中value 将是一个字符串,我将在获取/设置值时进行相应转换.所以一些示例记录将是:

[
    ['program_name' => 'invoice_number', 'value_type' => 'int', 'value' => '12345'],
    ['program_name' => 'last_merge', 'value_type' => 'date', 'value' => '10.06.2020'],//etc.
]

让我停下来的是 MySQL 中缺少列类型 Type。非常感谢您对任何建议的任何帮助!

附:我将 MySQL MariaDB 与 Laravel 5.8 一起使用。

【问题讨论】:

  • varchar 作为类型表的外键。

标签: mysql laravel mariadb laravel-5.8


【解决方案1】:

您可以编写自己的约束:

CREATE TABLE global_variables (  
     id serial,  
     ...
     value_type varchar(32),
     constraint check (value_type in ("int", "date", "varchar", "boolean" ... ))
);

【讨论】:

    【解决方案2】:

    因此,经过一些调试和试验,我想出了一个最适合我的案例的工作解决方案。我将value_type 列注册为给定允许类型的枚举,然后在value 字段上为我的GlobalVariable 模型创建一个访问器和一个修改器(Laravel 功能),从而相应地转换值。感谢您的建议!

    【讨论】:

    • 很好.. 你找到了最糟糕的解决方案 ;-)
    • @PaulSpiegel 为什么会这样?我很乐意改进这种方法中可能出现的错误,需要详细说明吗?
    • 好吧——也许不是最糟糕的。但是你应该小心使用 ENUM。一些陷阱:允许空字符串。按防御顺序排序 - 不是按字母顺序。在大表上进行更改可能会非常昂贵。
    【解决方案3】:

    只需将它们存储为字符串。

    在日期上下文中,字符串会自动转换。

    在数字上下文中,字符串会自动转换。

    在布尔上下文中,数字 0 为假,其他为真。

    如果你有反例,让我们看看。可能有一个简单的解决方法。

    【讨论】:

    • “其他都是真的” - 不是'true' :-)
    猜你喜欢
    • 2022-07-22
    • 2011-07-29
    • 2012-02-11
    • 2012-11-26
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    相关资源
    最近更新 更多