【问题标题】:MySQL query returns no resultMySQL 查询不返回结果
【发布时间】:2017-05-11 13:44:46
【问题描述】:

我将字段 iddate 定义为 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:迄今为止的发现总结:

  1. Lo​​calhost (MySQL 5.6.24) 有效,服务器 (MySQL 5.5.55-0+deb7u1) 无效。
  2. 问题出现在我的代码和服务器上的 PHPMyAdmin 中,但在本地工作,所以我消除了代码问题。
  3. show variables like 'char%' 查询显示本地和服务器上的所有字符集设置相同。
  4. 数据库和字段在服务器和本地具有相同的编码。
  5. 似乎不像许多 cmets 建议的那样是强制转换问题,因为该问题不存在于 localhost 上,仅存在于服务器上,除非服务器有配置或其他问题。
  6. ...?

【问题讨论】:

  • .... 这取决于数据类型 = date 可以说是一个字符串,date 应该用单引号括起来,如果 id 是一个 int 字段 - 不需要引号,在事实上,如果它是 int 就不要做引号
  • 这是类型转换。请勿引用日期以外的数字
  • @ThisGuyHasTwoThumbs 但是我的字段被定义为varchar?我正在使用 CI 的查询生成器,所以我实际上并没有添加任何引号。他们的图书馆正在自动完成......
  • @clearshot66 好的 - 那么我该如何解决这个问题?我不是手动添加引号。它是由 CodeIgniter 的 DB 类添加的。我将添加我在问题上使用的确切代码。
  • 回滚,就像在 SQL 中一样:CAST(id AS Integer)

标签: php mysql codeigniter


【解决方案1】:

id 可能在您的数据库中定义为整数。要匹配整数字段,您不需要使用引号。匹配字符串或文本字段时使用引号。

【讨论】:

  • 定义为 varchar(16) 而不是 int。
【解决方案2】:

这应该将它从 codeigniter 的自动转换中转换回来:

SELECT * 
FROM `members` 
WHERE `id` = '4412040999876'
AND `date` = '201706054783'


SELECT * 
FROM `members` 
WHERE CAST(`id` as INTEGER) = '4412040999876'
AND `date` = '201706054783'

【讨论】:

  • 这会导致“您的 SQL 语法有错误” - SELECT * FROM members WHERE CAST id AS INTEGER) = '44...' AND date = '。 ..'
  • 我是通过我的数据库完成的,它运行良好......你有 CAST( ,你复制的没有。如果你的列是 varchar 尝试转换为 VARCHAR 。
  • 用 VARCHAR 替换 INTEGER 时,出现语法错误。当用 CHAR 替换它时,查询会运行,但没有结果。
  • 如果它在没有 ' ' 的情况下提取结果而没有,这绝对是一个类型转换问题,只需继续谷歌搜索并测试不同模式的东西人
【解决方案3】:

尝试使用这个

$this->db->from('members');
$this->db->where('id',$id);
$this->db->where($field,$mem);
$q = $this->db->get();
return $q->result_array();

【讨论】:

  • 试过了,谢谢,但它不起作用。更深层次的问题,虽然我知道这是一个铸造问题,但这是在我的本地主机上工作,而不是在服务器上,所以我真的很困惑。我决定手动清理用户输入,问题在功能上得到解决,但不是我需要的工作方式。
  • 它不是强制转换问题。尝试在您的问题中包含您的表结构和少量数据。
【解决方案4】:

这是因为引号表示它是一个字符串,而 id 字段是一个整数,必须不带引号。

日期相同。内部日期存储为整数,但只要它们具有适当的格式,就能够将字符串转换为日期

【讨论】:

  • 见第一行问题。两者都在我的表中定义为 varchar(16)...
  • 你确定吗?再次检查您的数据库定义。我在一些项目中使用了 CI,并且从未自动添加引号。记录您的查询。 log_message('debug', $query);
猜你喜欢
  • 1970-01-01
  • 2023-02-09
  • 2021-11-27
  • 2015-01-29
  • 2017-05-18
  • 2023-03-08
  • 1970-01-01
  • 2015-06-11
  • 2019-08-08
相关资源
最近更新 更多