是否关闭Perl MySQL insert语句中的警告?
我正在使用PerlDBI插入MySQL数据库。一些变量被故意设置为是否关闭Perl MySQL insert语句中的警告?,mysql,perl,dbi,Mysql,Perl,Dbi,我正在使用PerlDBI插入MySQL数据库。一些变量被故意设置为 undef 变量的值不可用,因此该变量的目的是 NULL 在数据库中 但是,我在insert语句中收到有关未初始化值的警告 这里的最佳实践是什么?就我所见,除了在没有可用值时将变量设置为undef之外,没有其他方法可以在MySQL数据库中正确分配NULL。我应该关闭未初始化值的警告吗?您可能正在这样做 $dbh->do("INSERT INTO Foo ( field ) VALUES ( '$x' )"
undef
变量的值不可用,因此该变量的目的是
NULL
在数据库中
但是,我在insert语句中收到有关未初始化值的警告
这里的最佳实践是什么?就我所见,除了在没有可用值时将变量设置为undef之外,没有其他方法可以在MySQL数据库中正确分配NULL。我应该关闭未初始化值的警告吗?您可能正在这样做
$dbh->do("INSERT INTO Foo ( field ) VALUES ( '$x' )");
在这种情况下,当$x
为undef
时,插入的是一个空字符串,而不是NULL。它也会打断其他值(例如,包含单引号的值)。这就是你应该做的:
my $x_lit = defined($x) ? $dbh->quote($x) : 'NULL';
$dbh->do("INSERT INTO Foo ( field ) VALUES ( $x_lit )");
或者更好:
$dbh->do("INSERT INTO Foo ( field ) VALUES ( ? )", undef, $x);
你可能在做什么
$dbh->do("INSERT INTO Foo ( field ) VALUES ( '$x' )");
在这种情况下,当$x
为undef
时,插入的是一个空字符串,而不是NULL。它也会打断其他值(例如,包含单引号的值)。这就是你应该做的:
my $x_lit = defined($x) ? $dbh->quote($x) : 'NULL';
$dbh->do("INSERT INTO Foo ( field ) VALUES ( $x_lit )");
或者更好:
$dbh->do("INSERT INTO Foo ( field ) VALUES ( ? )", undef, $x);
可以显示您的警告消息吗?在连接(.)中使用未初始化的值$blah,或在null_to_数据库第1450行使用字符串。@user1849286您正在做许多人在使用DBI模块时正在做的事情:不使用占位符。这可能是危险和有问题的,当然也不容易。请参阅文档。此警告为串联未定义值。此处有更多详细信息-您能显示您的警告消息吗?在连接(.)中使用未初始化的值$blah或在null_to_数据库第1450行使用字符串。@user1849286您正在做许多人在使用DBI模块时正在做的事情:不使用占位符。这可能是危险和有问题的,当然也不容易。请参阅文档。此警告为串联未定义值。这里有更多详细信息-这是否意味着我可以通过脚本在不存在值的地方分配值“NULL”,并且仍然希望在MySQL数据库中正确定义NULL?分配值“NULL”不会在数据库中创建正确的NULL值-它会创建文本字符串“NULL”的值,对吗?上面,如果没有定义$x,那么赋值“NULL”不是用来插入NULL值的吗?因此不起作用。不,不能。将字符串
NULL
放入$x
将不起作用,这就是我没有这样做的原因。请注意,在构造的SQL语句中,NULL
周围没有引号。在构造的SQL语句中,NULL周围有单引号。但是好的,我明白了,我们基本上必须在SQL语句中使用的文本值中创建一个不带引号的NULL,谢谢没有。当$x
未定义时,我的代码不会在NULL
周围加引号。这是否意味着我可以通过脚本在不存在值的地方分配值“NULL”,并且仍然希望在MySQL数据库中正确定义NULL?分配值“NULL”不会在数据库中创建正确的NULL值-它会创建一个文本字符串“NULL”的值是否正确?上面,如果没有定义$x,那么赋值“NULL”不是用来插入NULL值的吗?因此不起作用。不,不能。将字符串NULL
放入$x
将不起作用,这就是我没有这样做的原因。请注意,在构造的SQL语句中,NULL
周围没有引号。在构造的SQL语句中,NULL周围有单引号。但是好的,我明白了,我们基本上必须在SQL语句中使用的文本值中创建一个不带引号的NULL,谢谢没有。当$x
未定义时,我的代码不会在NULL
周围加引号。