【发布时间】:2010-09-20 22:53:26
【问题描述】:
我曾经使用标准的 mysql_connect()、mysql_query() 等语句从 PHP 中执行 MySQL 操作。最近我一直在转而使用美妙的 MDB2 类。除此之外,我还使用准备好的语句,所以我不必担心逃避输入和 SQL 注入攻击。
但是,我遇到了一个问题。我有一个包含几个 VARCHAR 列的表,这些列被指定为非空(即,不允许 NULL 值)。使用旧的 MySQL PHP 命令,我可以毫无问题地做这样的事情:
INSERT INTO mytable SET somevarchar = '';
但是,如果我有这样的查询:
INSERT INTO mytable SET somevarchar = ?;
然后在 PHP 中我有:
$value = "";
$prepared = $db->prepare($query, array('text'));
$result = $prepared->execute($value);
这将抛出错误“null value violates not-null constraint”
作为一种临时解决方法,我检查 $value 是否为空,并将其更改为 " "(一个空格),但这是一个可怕的 hack,可能会导致其他问题。
我应该如何使用准备好的语句插入空字符串,而不是尝试插入 NULL?
编辑:这是一个太大的项目,无法遍历我的整个代码库,找到使用空字符串“”的所有地方并将其更改为使用 NULL。我需要知道的是为什么标准 MySQL 查询将“”和 NULL 视为两个独立的事物(我认为是正确的),但准备好的语句将“”转换为 NULL。
请注意,“”和 NULL 不是相同的东西。例如,SELECT NULL = ""; 返回 NULL 而不是您所期望的 1。
【问题讨论】:
-
如果插入" ",基本为null,为什么不将db中的字段更改为允许null。
-
它“基本上为空”,就像 0“基本上”为假一样。它们很相似,但实际上完全不同。
-
NULL 表示“无值”不是,“空字符串”
-
这是真的,但是存储一个“空”,因为它不包含数据、值,我几乎肯定比存储一个 NULL 成本更高
-
你说 NULL 和 "" 不一样是对的,但是你不应该像 SELECT NULL = "";无论您将什么值与 null 进行比较,这些都将始终返回 null
标签: php mysql mysqli nullable prepared-statement