从角度表单复选框保存布尔真/假并将其保存到 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 表单或任何具有复选框之类的表单传递数据 boolean 是 javascript 中的有效类型。它是 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 - 将整数拆分为位或布尔值