从角度表单复选框保存布尔真/假并将其保存到 Oracle 等后端数据库的正确方法是啥? [关闭]

Posted

技术标签:

【中文标题】从角度表单复选框保存布尔真/假并将其保存到 Oracle 等后端数据库的正确方法是啥? [关闭]【英文标题】:What is the proper way to save a Boolean true/false from an angular form checkbox and have it saved to a backend database like Oracle? [closed]从角度表单复选框保存布尔真/假并将其保存到 Oracle 等后端数据库的正确方法是什么? [关闭] 【发布时间】:2020-01-03 20:53:27 【问题描述】:

例如使用 Angular 材质并使用 [(ngModel)]="isActive" name="isActive"

这将提交带有 "isActive" = true 的表单

数据库中保存它的正确方法是什么?我知道在 Oracle 中并没有真正的布尔数据类型......

是否应该将其保存为 Char 数据类型?但如果是这样,那么它期望的 'T' 或 'F' 不是真或假。

应该将其保存为 varchar 吗?所以它可以除了真假吗?

感谢您提供有关此的任何信息或正确的数据结构。

【问题讨论】:

***.com/questions/3726758/… 我@Reactgular 明白有办法将它作为布尔值保存在 Oracle 数据库中,但是应该如何从 Angular 表单或任何具有复选框之类的表单传递数据 booleanjavascript 中的有效类型。它是 JSON 中的有效类型。如果你可以用 JavaScript 边喝咖啡边聊聊天。它会解释它不关心后端与 booleans 的问题,如果你要求 Oracle 加入你的对话(它会喝茶,因为它是那种不同的)。 Oracle 会说“我不关心布尔值或这个名为 JavaScript 的其他人”。所以你们都会同意不同意,既然你是程序员,那么你只需要伪造它就可以让它工作。 【参考方案1】:

在 Angular 中,当它被发送到后端时,我会将其保留为布尔值,我会将其转换为 1 或 0 的字符。在 oracle 中,我会将列设置为:

col CHAR(1),
CONSTRAINT cons_atable_col1 CHECK (col1 IN ('1','0'))

所以它只接受 0 或 1。

如果需要更多细节或说明,请告诉我。

【讨论】:

【参考方案2】:

如何存储布尔值很大程度上取决于存储值的字段的语义。有时将布尔值存储为包含“T”/“F”、“Y”/“N”、“IN”/“OUT”、“BLACK”/“WHITE”、“PINK”/“BLUE”的字符字段是合理的,或任何适合您的数据。有时您可能希望将该布尔值作为数字存储在 Oracle 中,允许的值为 1 和 0、或 100 / 0、或 1 / -1,或任何适合您需要的值。我们经常使用布尔值来表示任意数量的不同事物——这就是 Oracle 不提供布尔类型的原因。您应该使用适合您的应用程序的数据类型和值。

就 CHAR 与 VARCHAR2 参数而言,我建议使用 VARCHAR2,因为 CHAR 的行为并不总是如您(或至少“我”:-)所期望的那样。作为解释,请考虑以下块:

DECLARE 
  PROCEDURE test_string(pinString IN VARCHAR2) IS
    strTest  VARCHAR2(3) := pinString;
    cTest    CHAR(3)     := pinString;
  BEGIN
    DBMS_OUTPUT.PUT_LINE('strTest=' || CASE
                                         WHEN strTest IS NULL THEN 'NULL'
                                         ELSE '''' || strTest || ''''
                                       END ||
                         '  cTest=' || CASE
                                         WHEN cTest IS NULL THEN 'NULL'
                                         ELSE '''' || cTest || ''''
                                       END);
  END test_string;

BEGIN
  test_string('A');
  test_string('AB');
  test_string('ABC');
  test_string('');
  test_string(NULL);
END;

运行此输出时:

strTest='A'  cTest='A  '
strTest='AB'  cTest='AB '
strTest='ABC'  cTest='ABC'
strTest=NULL  cTest='   '
strTest=NULL  cTest=NULL

前三行和最后一行并不意外,但第四行让我有点意外。我一直都明白空字符串等价于 NULL。但是,第四行和第五行的输出似乎与该假设相反。在第四行中,我们为 VARCHAR2 输入参数分配了一个长度为零的字符串,该参数随后被分配给 strTest 和 cTest。在 strTest 的情况下,当我们在 VARCHAR2 测试代码中对其进行测试时,它被检测为 NULL。但是,当将此零长度字符串分配给 cTest 时,cTest 会在右侧用空格填充,直到它长满 3 个字符。在 CHAR 数据类型的上下文中考虑时,这并不奇怪,但是根据我对 VARCHAR2 的使用,它会产生我不期望的结果。这也很有趣,因为它意味着 A)零长度 VARCHAR2 值实际上存储为零长度字符串而不是 NULL,并且 B)“零长度字符串是 NULL”的确定是在运行时完成的.

【讨论】:

以上是关于从角度表单复选框保存布尔真/假并将其保存到 Oracle 等后端数据库的正确方法是啥? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

复选框值真/假

Telegraf/InfluxDB - 将整数拆分为位或布尔值

Python 布尔值在数据库怎么显示

如何创建和填写 PDF 表单

如何从复选框数组中保存布尔状态并在使用 SharedPreferences 加载适配器时加载它们的状态

flask处理表单数据