查询给出#1305 - FUNCTION database-name.LEN不存在;为什么?

时间:2014-01-04 13:22:37

标签: mysql

EDIT3 MySQL Fiddle Here。我已经制作了示例MySQL,因此您可以看到实际问题。虽然我希望在Jamie Foxx, Christoph Waltz结果中有2 names,但它会提供更多内容。即使它的编写方式与SQL示例中的方式完全相同,也可以正确返回名称。 :/

EDIT2 SQL Fiddle here。这是一个更简单的版本,但逻辑就在那里。我需要在MySQL中使用此功能,因为小提琴在SQL中。当我用SQLLENGTH替换LOCATE函数并使用PhpMyAdmin进行测试时,它会返回actors列的全部内容,而不仅仅是前两个名称。我现在更加困惑,因为LOCATE应该等同于CHARINDEX

EDIT1 *哦,我刚发现LEN中不存在CHARINDEXMySQL。我想我可以用LEN替换LENGTH,但我不知道如何处理CHARINDEX我尝试使用LOCATE,但结果不正确它给出了完整actors字段的内容。对此有何见解?

对我以前的问题的另一个跟进。这应该是它的结束。我有部分查询使用len函数在SQL Fiddle上工作,但是只要我在实际数据库中将其实现到最终查询中,我就得到函数不存在错误。列出下面我认为相关的所有内容:

MySQL查询

SELECT 
title,
director,
thumb,
LEFT(actors, LEN(actors) - CHARINDEX(', ', actors))AS '2 names' 
FROM test 
WHERE MATCH (title, director, actors) AGAINST ('arc*' IN BOOLEAN MODE)

错误

#1305 - FUNCTION database-name.LEN does not exist

设置

OS: MAC OSX
SERVER: MAMP
DB ACCESS: PhpMyAdmin

SHOW CREATE TABLE test

CREATE TABLE `test` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `title` varchar(255) NOT NULL,
 `director` varchar(255) NOT NULL,
 `actors` varchar(10000) NOT NULL DEFAULT 'Jamie Foxx, Christoph Waltz, Leonardo DiCaprio, Kerry Washington, Samuel L. Jackson',
 `summary` text NOT NULL,
 `cover` varchar(255) NOT NULL DEFAULT 'http://localhost:8888/assets/OBS/img/uploads/covers-thumb/django_thumb.jpg',
 `thumb` varchar(255) NOT NULL DEFAULT 'http://localhost:8888/assets/OBS/img/uploads/covers-bug/django1_cover.jpg',
 `trailer` varchar(255) NOT NULL DEFAULT 'fnaojlfdUbs',
 PRIMARY KEY (`id`),
 FULLTEXT KEY `myindex` (`title`,`director`,`actors`)
) ENGINE=MyISAM AUTO_INCREMENT=101 DEFAULT CHARSET=utf8

我真的不明白为什么我会收到此错误,因为该声明在SQL Fiddle上运行良好。如果您需要任何其他信息,请提出要求。感谢大家的阅读,并提前回复。

顺便说一句:它有可能是由actors varchar(10000)引起的吗?

1 个答案:

答案 0 :(得分:12)

MySQL没有内置的CHARINDEX()函数。相反,您可以使用LOCATE等效于charindex,而不是LEN,您可以使用LENGTH

SELECT 
title,
director,
thumb,
LEFT(actors, LENGTH(actors) - LOCATE(', ', actors))AS '2 names' 
FROM test 
WHERE MATCH (title, director, actors) AGAINST ('arc*' IN BOOLEAN MODE)

See fiddle demo

如果您只想显示两个演员姓名,可以使用SUBSTRING_INDEX

SELECT 
title,
director,
thumb,
SUBSTRING_INDEX(actors, ',', 2) AS '2 names' 
FROM test 
WHERE MATCH (title, director, actors) AGAINST ('test*' IN BOOLEAN MODE)

See second fiddle demo