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 INTOsites
(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 * FROM
sitesWHERE
site= '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子句不起作用的主要内容,如果未能解决你的问题,请参考以下文章
用于有序字符串的 postgresql where 子句不起作用
BigQuery 的 WHERE 子句中的 SELECT 语句不起作用