MySQL支持内置(本地)函数、可加载函数和存储函数。本节描述服务器如何识别内置函数的名称是用作函数调用还是用作标识符,以及当存在具有给定名称的不同类型函数时,服务器如何确定使用哪个函数。
解析器使用默认规则解析内置函数的名称。属性可以更改这些规则IGNORE_SPACE
SQL模式。
当解析器遇到内置函数名的单词时,它必须确定该名称是表示函数调用,还是表示对标识符(如表或列名)的非表达式引用。例如,在下面的语句中,第一个引用数
是一个函数调用,而第二个引用是一个表名:
SELECT COUNT(*)CREATE TABLE count (i INT);
只有在解析预期为表达式的内容时,解析器才应该将内置函数的名称识别为函数调用。也就是说,在非表达式上下文中,函数名被允许作为标识符。
然而,一些内置函数有特殊的解析或实现考虑,因此解析器默认使用以下规则来区分它们的名称是用作函数调用还是用作非表达式上下文中的标识符:
若要在表达式中使用该名称作为函数调用,则名称与以下内容之间不能有空格
(
括号字符。相反,如果要将函数名用作标识符,则函数名后面不能紧跟圆括号。
函数调用的名称和圆括号之间不能有空格的要求只适用于有特殊考虑的内置函数。数
就是这样一个名字。的sql / lex.h
源文件列出了这些特殊函数的名称,下面的空格决定了它们的解释:由SYM_FN ()
宏符号[]
数组中。
下面列出了MySQL 5.7中受影响的函数IGNORE_SPACE
设置和列出为特殊sql / lex.h
源文件。您可能会发现,将无空格要求应用于所有函数调用是最容易的。
ADDDATE
BIT_AND
BIT_OR
BIT_XOR
投
数
CURDATE
CURTIME
DATE_ADD
DATE_SUB
提取
GROUP_CONCAT
马克斯
中期
最小值
现在
位置
为SESSION_USER
性病
STDDEV
STDDEV_POP
STDDEV_SAMP
SUBDATE
字符串的子串
子字符串
总和
SYSDATE
SYSTEM_USER
修剪
方差
VAR_POP
VAR_SAMP
中未列为特殊的函数sql / lex.h
,空格不重要。只有在表达式上下文中使用时,它们才被解释为函数调用,否则可以自由地用作标识符。美国信息交换标准代码
就是这样一个名字。然而,对于这些不受影响的函数名,表达式上下文中的解释可能会有所不同:
如果存在具有给定名称的内置函数,则解释为内置函数;如果不是这样,func_name
()
解释为可加载函数或存储函数(如果存在该名称)。func_name
()
的IGNORE_SPACE
SQL模式可以用来修改解析器对空格敏感的函数名的处理方式:
与
IGNORE_SPACE
禁用时,当名称和后面的括号之间没有空格时,解析器将名称解释为函数调用。即使在非表达式上下文中使用函数名,也会发生这种情况:CREATE TABLE count(i INT);错误1064(42000):你的SQL语法有错误…接近count(i INT)
为了消除错误并使名称被视为标识符,可以在名称后使用空格或将其写成带引号的标识符(或两者都有):
CREATE TABLE count (i INT);创建表count (i INT);创建表count (i INT);
与
IGNORE_SPACE
启用后,解析器将取消函数名和后面的括号之间没有空格的要求。这为编写函数调用提供了更大的灵活性。例如,下列函数调用都是合法的:SELECT COUNT(*)SELECT COUNT (*)
然而,使
IGNORE_SPACE
还有一个副作用,解析器将受影响的函数名视为保留字(请参阅第9.3节“关键字及保留词”).这意味着名称后面的空格不再表示其用作标识符。该名称可以在函数调用中使用,后面有或没有空格,但在非表达式上下文中会导致语法错误,除非它被引用。例如,用IGNORE_SPACE
启用后,以下两个语句都将失败,并出现语法错误,因为解析器将进行解释数
作为保留词:CREATE TABLE count(i INT);CREATE TABLE count (i INT);
要在非表达式上下文中使用函数名,请将其写成带引号的标识符:
创建表count (i INT);创建表count (i INT);
要启用IGNORE_SPACE
SQL模式,使用以下语句:
SET sql_mode = 'IGNORE_SPACE';
IGNORE_SPACE
也可以通过某些其他复合模式启用,例如ANSI
包括在他们的价值中:
SET sql_mode = 'ANSI';
检查章节5.1.10,“Server SQL模式”,以查看哪些复合模式启用IGNORE_SPACE
.
来减少SQL代码对IGNORE_SPACE
设置时,使用以下指南:
避免创建与内置函数同名的可加载函数或存储函数。
避免在非表达式上下文中使用函数名。例如,这些语句使用
数
受影响的函数名之一IGNORE_SPACE
),所以如果名称后面有或没有空格,它们都会失败IGNORE_SPACE
启用:CREATE TABLE count(i INT);CREATE TABLE count (i INT);
如果必须在非表达式上下文中使用函数名,请将其写成带引号的标识符:
创建表count (i INT);创建表count (i INT);
下面的规则描述了服务器在函数创建和调用时如何解析对函数名的引用:
上述函数名解析规则对升级到实现新内置函数的MySQL版本有影响: