【发布时间】:2017-05-11 13:44:46
【问题描述】:
我将字段 id 和 date 定义为 VARCHAR(16)
当我做这个查询时:
SELECT *
FROM `members`
WHERE `id` = '4412040999876'
AND `date` = '201706054783'
我没有得到任何结果。
当我这样做时:
SELECT *
FROM `members`
WHERE `id` = 4412040999876
AND `date` = 201706054783
注意 - 没有引号 - 我得到了我期望的结果。
编辑: 这是使用的代码 - 我不是手动添加引号。 CI 的 DB 类正在添加它们。
public function get_member_match($id, $mem, $field = 'name')
{
$sql = "
SELECT *
FROM `members`
WHERE `id` = ?
AND `" . $field . "` = ?
";
$sql_array = array($id, $mem);
$q = $this->db->query($sql, $sql_array);
return $q->result_array();
}
我称这个函数为:
$this->members_model->get_member_match($id, $date, 'date');
我输出查询,变量匹配正确,没有错误,只有引号。
知道为什么吗?我以前从来没有遇到过这个问题。使用 Query Builder 处理 CodeIgniter 3。
EDIT2:迄今为止的发现总结:
- Localhost (MySQL 5.6.24) 有效,服务器 (MySQL 5.5.55-0+deb7u1) 无效。
- 问题出现在我的代码和服务器上的 PHPMyAdmin 中,但在本地工作,所以我消除了代码问题。
-
show variables like 'char%'查询显示本地和服务器上的所有字符集设置相同。 - 数据库和字段在服务器和本地具有相同的编码。
- 似乎不像许多 cmets 建议的那样是强制转换问题,因为该问题不存在于 localhost 上,仅存在于服务器上,除非服务器有配置或其他问题。
- ...?
【问题讨论】:
-
.... 这取决于数据类型 = date 可以说是一个字符串,date 应该用单引号括起来,如果 id 是一个 int 字段 - 不需要引号,在事实上,如果它是 int 就不要做引号
-
这是类型转换。请勿引用日期以外的数字
-
@ThisGuyHasTwoThumbs 但是我的字段被定义为varchar?我正在使用 CI 的查询生成器,所以我实际上并没有添加任何引号。他们的图书馆正在自动完成......
-
@clearshot66 好的 - 那么我该如何解决这个问题?我不是手动添加引号。它是由 CodeIgniter 的 DB 类添加的。我将添加我在问题上使用的确切代码。
-
回滚,就像在 SQL 中一样:CAST(id AS Integer)
标签: php mysql codeigniter