我有两个数据库
数据库1:作业->使用自动增量ID
数据库2:CompletedJobs->使用Guid作为ID
我的程序中有一个报告页面,该页面将从Jobs表中获取一个jobId并显示该报告。我当前正在扩展此功能,以便jobId也可以成为Guid
代码进行检查以查看jobId是否为有效的guid,如果不是,则将检查JobId是否为来自Job表的ID
我发现的是,如果我输入66A
之类的内容。它可以说出它不是有效的GUID,但是会在作业表中找到记录66
。
您可以在此sqlfiddler中看到此行为:http://sqlfiddle.com/#!9/a593d8/5
我的问题是我需要找到一种方法来防止在搜索中出现此怪癖。
下面是我准备好的用于Job表的语句代码
if (!($stmt = $this->conn->prepare("SELECT * FROM job WHERE _id = ? AND exported = 0"))) {
echo "Prepare failed: (" . $this->conn->errno . ") " . $this->conn->error;
$this->CloseStmtConnection($stmt);
}
if (!$stmt->bind_param("i", $id)){
echo "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error;
$this->CloseStmtConnection($stmt);
}
if (!$stmt->execute()) {
echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
$this->CloseStmtConnection($stmt);
}
$results = $stmt->get_result();
任何想法都会很棒,我曾尝试使用LIKE
和BINARY
,但想法不多了
问题是隐式转换。大概id
是一个数字,您正尝试将其与字符串('66A'
)进行比较。
[发生这种情况时,MySQL将字符串转换为数字以进行比较:由于'66A'
以数字开头,因此将其转换为66
。如果它不是以数字开头(例如'A66'
),它将被转换为0
。
您可以通过在字符串上下文中强制进行比较来解决此问题:
select * from test where cast(id as char) = '66A';