Sql where子句不起作用

Posted

技术标签:

【中文标题】Sql where子句不起作用【英文标题】:Sql where clause not working 【发布时间】:2015-01-27 21:50:09 【问题描述】:

SQL where 子句在我的数据库中不起作用。

我有一个名为“网站”的表格和类似的结构

id     site
1      xyz.com
2      google.com
3      example.com

我正在运行这个 SQL 查询

SELECT * FROM `sites` WHERE `site` = "google.com";

但是我得到了这个输出

 mysql returned an empty result set (i.e. zero rows). (Query took 0.0009 sec)

我这辈子从来没有见过这样的事情。

更新:截图

我不想在项目中应用此查询。

SELECT * FROM `sites` WHERE `site` LIKE "%google.com%";

#


真正的问题在于insert 创建数据库的命令。 试试

INSERT INTO sites (id, site) VALUES (1, '\nxyz.com\n'), (2, '\ngoogle.com\n'), (3, '\nexample.com\n')

并手动检查表中的记录。你不会看到换行符。这是我注意到的 SQL 中的一个问题。

【问题讨论】:

我多次检查表中没有任何空间。 你试过单引号吗? ' ('google.com') 如果可能,请为我提供解决方案,而不是否定标志。你可以在你的服务器上测试它。真的不行。我在编程方面并不差。 您能在该列上显示一些示例数据吗?甚至可以是屏幕截图 你也可以试试WHERE TRIM(site) = "google.com" 【参考方案1】:

更新:OP 在他的数据集中有不可见的换行符 (\n)。 @EternalPoster(和我)认为 Trim 会删除 所有空格,但 MySql Trim Documentation 指定前导和尾随 空格


这就是我所做的:

-- for http://***.com/questions/27203169/sql-query-not-work-for-google-com
-- and http://***.com/questions/27202157/sql-where-clause-not-working

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

-- --------------------------------------------------------

DROP TABLE IF EXISTS `sites`;

--
--  structure for table `sites`
--
CREATE TABLE IF NOT EXISTS `sites` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `site` varchar(32) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

--
-- data for table `sites`
--
INSERT INTO `sites` (`id`, `site`) VALUES
(1, 'xyz.com'),
(2, 'google.com'),
(3, 'example.com');

--
-- select google
--
SELECT * 
FROM sites 
WHERE site = 'google.com'
;

--
-- select google
--
SELECT * 
FROM sites 
WHERE site = 'google.com'
;

这就是我得到的:

因此,就我而言,我看到脚本按预期运行。

您的案例有什么不同? 我的安装是一个相当默认的设置。 Like '%google.com%' 在您的数据集上工作的事实表明了几件事。人们已经建议TRIM,因为Like 表达式会匹配不可见字符(空格、制表符、退格、空值)。 MySQL 有一个单独的运算符REGEXP 用于正则表达式,因此. 字符似乎没有被用作通配符,但这可能值得一看。

创建一个空数据库并尝试运行我上面的脚本。你得到的结果和我一样吗?

【讨论】:

我发现了问题。我导出 sql 文件看看什么>> INSERT INTO sites (id, site) VALUES (1, '\nxyz.com\n'), (2, '\ngoogle.com\n'), ( 3, '\nexample.com\n'); 非常感谢兄弟的帮助。 试试这个 sql 查询 INSERT INTO sites (id, site) VALUES (1, '\nxyz.com\n'), (2, '\ngoogle.com\n'), (3, '\nexample.com\n'); 并手动签入表。你找不到空格或换行符。这是我注意到的 sql 中的一个问题。【参考方案2】:

使用这个查询

select * from sites where site = 'google.com';

【讨论】:

从像“google.com”这样的网站中选择*;用like关键字替换'='运算符【参考方案3】:

您必须使用 mysql manual 中描述的单引号。看看最后一个例子。 此外,你应该摆脱site周围的``

SELECT *
FROM `sites`
WHERE site = 'google.com';

【讨论】:

不工作并且(将站点属性放入``)无关紧要 很奇怪...你可以尝试使用 LIKE 运算符而不是 = 吗?在这里查看:SQL LIKE Operator【参考方案4】:
SELECT * FROM `sites` WHERE `site` = 'google.com';

【讨论】:

【参考方案5】:

我的第一个答案:

使用单引号,SELECT * FROMsitesWHEREsite= 'google.com';

关于单引号/双引号语法,这取决于您的 SQL 模式。来自MySQL documentation:

ANSI_QUOTES 模式导致服务器解释双引号 字符串作为标识符。因此,当启用此模式时, 字符串文字必须用单引号括起来。他们 不能用双引号括起来。服务器 SQL 模式 如第 5.1.6 节“服务器 SQL 模式”中所述进行控制。

我在 OP 编辑​​后的第二个回答:

查看屏幕截图后,您的数据库或空格中的 URL 上方似乎有一个空行。您需要手动或使用TRIM 将其删除。

要测试是否有空格,可以使用通配符:

SELECT `site` FROM `sites` WHERE `site` LIKE '%google.com%'

如果你得到一个结果,你就知道有空格。如果您想在不永久删除空格的情况下解决该问题:

SELECT TRIM(site) FROM `sites` WHERE `site` LIKE '%google.com%'

仅从一行中永久删除空格:

UPDATE `sites` SET `site` = TRIM(site) WHERE `site` LIKE '%google.com%'

要从所有行中永久删除空格(首先备份表),您可以:

UPDATE `sites` SET `site` = TRIM(site)

【讨论】:

不,没有空格或行。我已经仔细检查了。你能在你的服务器上测试这个问题吗?【参考方案6】:

使用这个

select * from tb_name where col_name1 = 'your_value1' and col_name2 = 'your_value2' 

【讨论】:

使用我的查询我得到了数据,所以它正在工作,其他明智的你可以使用SELECT * FROM sites WHERE site LIKE 'google.com' 但是尝试使用这些数据。只需输入 id - 1 和站点 - google.com,然后应用相同的查询。你可以指出这个问题。【参考方案7】:

备份您的数据并安装全新的 mysql 设置...它可能已损坏

【讨论】:

我在我的 VPS 主机中执行此操作,而不是 localhost。 并且还在另外两台服务器上进行了测试。你也可以试试。 在你的情况下......你提供的 phpmyadmin 表的图片......网站库没有正常显示它的值......我猜额外的空格或输入正在被谷歌插入。 com...尝试php“TRIM”功能...在TRIM功能的帮助下插入新值。像这样 如果这行得通...这意味着之前插入的数据必须有一些错误

以上是关于Sql where子句不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 WHERE 子句在我的组合框中不起作用

SQLite 动态 WHERE 子句不起作用

用于有序字符串的 postgresql where 子句不起作用

BigQuery 的 WHERE 子句中的 SELECT 语句不起作用

Crystal Reports v13.0.2000.0.:为啥“where”子句在子报表中不起作用?

LINQ where 子句中的 async/await 不起作用