如何正确地将 NULL 值从 Bash 脚本分配给 MySQL

How to properly assign NULL value from Bash script to MySQL

提问人:DenisZ 提问时间:3/12/2023 更新时间:3/12/2023 访问量:170

问:

我有一个需要更新 MySQL DB 的 bash 脚本。我有一个语句来确定要放入 db 的内容,但我认为我将 NULL 值与 NULL 字符串混淆。我的代码如下:if

db_host="localhost"
db_user="user"
db_pass="pass"
db_name="dbname"
MyCmd="mysql -N -h $db_host -u $db_user -p$db_pass -D $db_name"
if [[ $LastCh > 1516980000 ]]; then
  NewCh="$(date -d @$LastCh +"%Y-%m-%d  %H:%M:%S")"
elif [ -n "$NewCh" ]; then
  NewCh=$($MyCmd -e "SELECT MAX(LastChange) FROM Status WHERE IDN=$idn AND LastChange>0")
#  NewCh=$($MyCmd -e "SELECT MAX(LastChange) FROM Status WHERE IDN=$idn AND LastChange IS NOT NULL")
else
  NewCh=NULL
fi    
StatSQL="IDN, Name, LastIP, Activesince, LastChange"
$MyCmd -e "INSERT INTO Status ($StatSQL) VALUES ('$idn', '$name', '$ip', '$activesince', '$NewCh')"

因此,如果我在脚本中得到它,我会将最后的更改分配给数据库,但如果没有,它需要从 IDN 字段的 imum 值中获取值,但如果至少有一个是 ,它会向我显示值。我怀疑它必须与我在某些情况下分配的实际字符串“NULL”并且我的子句不起作用时有关,所以我添加了额外的条件,该条件也不起作用(),但它与 一起使用,但也不是每种情况。
1.) 如何修改我的 NewCh 变量以能够携带 NULL 值?或者如何检查数据库中的字段是什么以及什么是“NULL”(字符串)
MAXNULLMAXNULLNULLWHERE.. AND LastChange IS NOT NULLLastChange>0NULL

mysql bash null

评论

0赞 Cyrus 3/12/2023
请在脚本中添加合适的 shebang (),然后将其粘贴到 shellcheck.net 处,并尝试实现其中提出的所有建议。#!/bin/bash
0赞 DenisZ 3/12/2023
我的脚本中还有其他变量,因此需要添加更多内容才能使脚本正常工作,不确定它是否有意义,但我想我得到了 NULLIF() 的解决方案
0赞 markp-fuso 3/13/2023
使单引号成为值的一部分 ... ... ... ;然后从语句中删除单引号......$NewChNewCh="'$(date ...)'"NewCh="'$($MyCmd ..)'"NewCh=NULLINSERTINSERT ... ( ...., '$activesince', $NewCh)"
0赞 DenisZ 3/13/2023
感谢@markp-fuso,这是更简单的解决方案,尽管我不确定是否会通过单引号执行,也可以在“”中使用变量$(data ...
0赞 markp-fuso 3/13/2023
@DenisZ外引号是双引号,所以,是的,应该按预期执行;add 以显示变量 ...您应该看到类似以下内容:datetypeset -p NewChdeclare -- NewCh="'2023-03-12 13:10:24'"

答:

1赞 ysth 3/12/2023 #1

Shell 变量没有特殊的 null 值。将它们设置为您始终希望作为 null 插入的特定字符串(可以是字符串 NULL 或空字符串或其他内容),并在插入中对其进行测试:

insert into tbl (col1,col2) values (nullif('$col1','specialnullvalue'),...

评论

1赞 DenisZ 3/12/2023
谢谢@ysth。我想我得到了你,所以我可以做并将我分配 NULL 值。添加到字段中,如果没有数学,则将是变量的值$NewCh 。NULLIF('$NewCh', 'NULL')