ITPub博客

首页 > 数据库 > > 9.2 方案对象名称

9.2 方案对象名称

作者:飘絮絮絮丶 时间:2020-05-12 11:27:56 0 删除 编辑

参考官方文档:

dev.mysql.com/doc/refma




MySQL中的某些对象,包括数据库,表,索引,列,别名,视图,存储过程,分区,表空间和其他对象名称都被称为标识符。 本节介绍MySQL中标识符的允许语法。 第9.2.2节“标识符区分大小写”描述了哪些类型的标识符区分大小写以及在什么条件下。



标识符可以用引号或不用引号。 如果标识符包含特殊字符或是保留字,则只要引用标识符就必须引起该标识符。 (例外:在限定名称后面的句点必须是一个标识符,因此不需要引用它。)



标识符在内部被转换为Unicode。 它们可能包含这些字符:

  • 非引号标识符中的允许字符:
    • ASCII:[0-9,a-z,A-Z$_](基本拉丁字母,数字0-9,$,_)
    • 拓展的: U+0080 .. U+FFFF
  • 带引号的标识符中的允许字符包括完整的Unicode基本多语言平面(BMP),U+0000除外:
    • ASCII : U+0001 .. U+007F
    • 拓展的: U+0080 .. U+FFFF
  • 带引号或不带引号的标识符不允许使用ASCII NUL(U+0000)和补充字符(U+10000或更高)。
  • 标识符可以以数字开头,但除非引起来否则不能只包含数字。



  • 数据库,表和列名称不能以空格字符结尾。



标识符引号字符是反引号(`):


mysql> SELECT * FROM `select` WHERE `select`.id > 100;


如果启用了ANSI_QUOTES SQL模式,则也可以在双引号内引用标识符:


mysql> CREATE TABLE "test" (col INT); ERROR 1064: You have an error in your SQL syntax...

mysql> SET sql_mode='ANSI_QUOTES';

mysql> CREATE TABLE "test" (col INT); Query OK, 0 rows affected (0.00 sec)


ANSI_QUOTES模式会导致服务器将双引号字符串解释为标识符。 因此,启用此模式时,字符串文字必须包含在单引号内。 它们不能用双引号括起来。


如果引用标识符,标识符引号字符可以包含在标识符中。 如果要包含在标识符中的字符与用于引用标识符本身的字符相同,则两个字符。 以下语句创建一个名为a`b的表,其中包含一个名为c"d的列:


mysql> CREATE TABLE `a``b` (`c"d` INT);



在查询的选择列表中,可以使用标识符或字符串引用字符指定带引号的列别名:


mysql> SELECT 1 AS `one`, 2 AS 'two';

+-----+-----+

| one | two |

+-----+-----+

| 1 | 2 |

+-----+-----+

在语句的其他地方, quoted 别名的引用必须使用标识符的 quote或将引用视为字符串文字。




建议您不要使用以Me或MeN开头的名称,其中M和N是整数。 例如,避免使用1e作为标识符,因为诸如1e + 3的表达式是不明确的。 根据上下文,它可能被解释为表达式1e + 3或数字1e+3。



使用MD5()生成表名时要小心,因为它可能会产生非法或不明确格式的名称,例如刚刚描述的那些。



用户变量不能在SQL语句中直接用作标识符或作为标识符的一部分。 有关更多信息和解决方法示例,请参见第9.4节“用户定义的变量”。



数据库和表名中的特殊字符按相应的文件系统名称进行编码,如第9.2.3节“将标识符映射到文件名”中所述。 如果您的旧版MySQL数据库或表中包含特殊字符,并且其基础目录名或文件名尚未更新为使用新编码,则服务器将显示其名称,其前缀为#mysql50#。 有关引用这些名称或将其转换为较新编码的信息,请参阅该部分。



下表描述了每种标识符的最大长度。





检查CREATE VIEW语句中的列名称的别名,最大列长度为64个字符(不是最大别名长度为256个字符)。



标识符使用Unicode(UTF-8)存储。 这适用于存储在.frm文件中的表定义中的标识符以及存储在mysql数据库授权表中的标识符。 授权表中标识符字符串列的大小以字符计量。 您可以使用多字节字符而不减少这些列中存储的值所允许的字符数。 如前所述,允许的Unicode字符是基本多语言平面(BMP)中的字符。 补充字符是不允许的。



9.2.1 标识符限定符


对象名称可能为被限定或则不被限定。 在名称的解释是明确的上下文中允许使用非限定名称。 限定名称至少包含一个限定词,通过覆盖默认上下文或提供缺少的上下文来阐明解释上下文。



例如,此语句使用非限定名称t1创建一个表:


CREATE TABLE t1 (i INT);


由于t1不包含用于指定数据库的限定符,因此语句会在默认数据库中创建表。 如果没有默认数据库,则会发生错误。


该语句使用限定名db1.t1创建一个表:


CREATE TABLE db1.t1 (i INT);


由于db1.t1包含数据库限定符db1,因此无论默认数据库如何,语句都会在名为db1的数据库中创建t1。 如果没有默认数据库,则必须指定限定符。 如果存在默认数据库,指定与默认值不同的数据库,或者如果默认值与指定的数据库相同,也显式指定数据库。


限定符具有以下特征:


  • 一个非限定名称由一个标识符组成。 一个限定名称由多个标识符组成。
  • 多部分名称的组成部分必须用句点(.)字符分隔。 多部分名称的起始部分充当限定符,影响解释最终标识符的上下文。
  • 限定符是一个单独的标记,不需要与关联的标识符连续。 例如,tbl_name.col_name和tbl_name。 col_name是等同的。
  • 如果多部分名称的任何组件需要引用,请单独引用它们而不是引用整个名称。 例如,写`my-table`.`my-column`,而不是`my-table.my-column`。
  • 在限定名称后面跟随一个句点的保留字必须是一个标识符,因此在该上下文中不需要引用它。
  • 语法.tbl_name表示默认数据库中的表tbl_name。



注意:

这个语法从MySQL 5.7.20开始不推荐使用,并且将在未来版本的MySQL中删除。


对象名称的允许限定符取决于对象类型:



  • 数据库名称是完全限定的并且不具有限定符:


CREATE DATABASE db1;


  • 表,视图或存储的程序名可以给定一个数据库名限定符。 CREATE语句中的非限定名称和限定名称的示例:



CREATE TABLE mytable ...;

CREATE VIEW myview ...;

CREATE PROCEDURE myproc ...;

CREATE FUNCTION myfunc ...;

CREATE EVENT myevent ...;


CREATE TABLE mydb.mytable ...;

CREATE VIEW mydb.myview ...;

CREATE PROCEDURE mydb.myproc ...;

CREATE FUNCTION mydb.myfunc ...;

CREATE EVENT mydb.myevent ...;



  • 触发器与表关联,所以任何限定符都适用于表名:


CREATE TRIGGER mytrigger ... ON mytable ...;

CREATE TRIGGER mytrigger ... ON mydb.mytable ...;



  • 如下表所示,列名可能会被赋予多个限定符以指示引用它的语句中的上下文。



Column Reference Meaning

col_name 来自语句中使用的任何表的列col_name包含该名称的列

tbl_name.col_name 默认数据库的table_name的col_name 列

db_name.tbl_name.col_name 数据库db_name的表 tbl_name中的列col_name



换句话说,列名可能会被赋予一个表名限定符,它本身可能会被赋予一个数据库名限定符。 SELECT语句中的非限定和限定列引用的示例:


SELECT c1 FROM mytable WHERE c2 > 100;


SELECT mytable.c1 FROM mytable

WHERE mytable.c2 > 100;


SELECT mydb.mytable.c1 FROM mydb.mytable

WHERE mydb.mytable.c2 > 100;


除非非限定的引用不明确,否则不需要为语句中的对象引用指定限定符。 假设列c1仅在表t1中出现,c2仅在t2中出现,并且c在t1和t2中出现。 在引用这两个表的语句中,对c的任何非限定引用都是不明确的,并且必须被限定为t1.c或t2.c,以指示您表示的是哪个表:


SELECT c1, c2, t1.c FROM t1 INNER JOIN t2 WHERE t2.c > 100;



同样,要从同一语句中的数据库db1中的表t和数据库db2中的表t检索,您必须限定表引用:对于对这些表中的列的引用,仅限于出现在这两个表中的列名的限定符表。 假设列c1只出现在表db1.t中,c2仅出现在db2.t中,c出现在db1.t和db2.t中。 在这种情况下,c不明确且必须是限定的,但c1和c2不必是:



SELECT c1, c2, db1.t.c FROM db1.t INNER JOIN db2.t WHERE db2.t.c > 100;


表别名使得能够更简单地写入限定的列引用:


SELECT c1, c2, t1.c FROM db1.t AS t1 INNER JOIN db2.t AS t2 WHERE t2.c > 100;



9.2.2 标识符大小写敏感性


在MySQL中,数据库对应于数据目录中的目录。 数据库中的每个表对应于数据库目录中的至少一个文件(可能更多,取决于存储引擎)。 触发器也对应于文件。 因此,底层操作系统的区分大小写在数据库,表和触发器名称的区分大小写中起着一定的作用。 这意味着这些名称在Windows中不区分大小写,但在大多数Unix中都区分大小写。 一个明显的例外是OS X,它基于Unix,但使用不区分大小写的默认文件系统类型(HFS +)。 但是,OS X还支持UFS卷,与任何Unix一样区分大小写。 请参见第1.8.1节“MySQL标准SQL扩展”。 lower_case_table_names系统变量也会影响服务器如何处理标识符区分大小写,如本节后面所述。



注意:

虽然数据库,表和触发器名称在某些平台上不区分大小写,但不应在同一语句中使用不同的情况来引用。 以下语句不起作用,因为它引用了my_table和my_table两个表:

mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;



列,索引,存储例程和事件名称在任何平台上都不区分大小写,列别名也不区分大小写。


但是,日志文件组的名称区分大小写。 这与标准SQL不同。


默认情况下,表别名在Unix上区分大小写,但在Windows或OS X上不区分大小写。以下语句在Unix上不起作用,因为它将别名同时指定为A和A:


mysql> SELECT col_name FROM tbl_name AS a

WHERE a.col_name = 1 OR A.col_name = 2;


但是,相同的语句 Windows上允许使用。 为了避免这些差异导致的问题,最好采用一致的约定,例如始终使用小写名称创建和引用数据库和表。 建议使用此惯例以实现最大的便携性和易用性。


表和数据库名称如何存储在磁盘上并在MySQL中使用受到lower_case_table_names系统变量的影响,您可以在启动mysqld时设置它。 lower_case_table_names可以采用下表中显示的值。 此变量不会影响触发器标识符的大小写敏感性。 在Unix上,lower_case_table_names的默认值为0.在Windows上,默认值为1.在OS X上,默认值为2。



0:

表和数据库名称使用CREATE TABLE或CREATE DATABASE语句中指定的大小写存储在磁盘上。 名称比较区分大小写。 如果您在具有不区分大小写的文件名(例如Windows或OS X)的系统上运行MySQL,则不应将此变量设置为0。 如果在不区分大小写的文件系统上使用--lower-case-table-names = 0强制将此变量设置为0,并使用不同的大小写访问MyISAM表名,则可能会导致索引损坏。


1:

表名称在磁盘上以小写形式存储,名称比较不区分大小写。 MySQL在存储和查找时将所有表名称转换为小写字母。 这种行为也适用于数据库名称和表别名。



2:

表和数据库名称使用CREATE TABLE或CREATE DATABASE语句中指定的大小写存储在磁盘上,但MySQL在查找时将它们转换为小写。 名称比较不区分大小写。 这仅适用于不区分大小写的文件系统! InnoDB表名称以小写形式存储,与lower_case_table_names = 1相同。



如果您仅在一个平台上使用MySQL,则通常不必将lower_case_table_names变量从默认值更改。 但是,如果要在文件系统区分大小写不同的平台之间传输表,可能会遇到困难。 例如,在Unix上,可以有两个名为my_table和MY_TABLE的表,但在Windows上,这两个名称被认为是相同的。 为了避免数据库或表名称发生数据传输问题,您有两种选择:



  • 在所有系统上使用lower_case_table_names = 1。 这样做的主要缺点是,当您使用SHOW TABLES或SHOW DATABASES时,您看不到名称中的原始大小写。
  • 在Unix上使用lower_case_table_names = 0,在Windows上使用lower_case_table_names = 2。 这保留了数据库和表名的字母大小写。 这样做的缺点是,您必须确保您的语句始终在Windows上使用正确的大小写引用数据库和表名。 如果你将你的语句转移到Unix中,那么大小写是有意义的,如果这个casecase是不正确的,它们将不起作用。



例外:

如果您使用的是InnoDB表,并且您试图避免这些数据传输问题,则应在所有平台上将lower_case_table_names设置为1以强制名称转换为小写。



如果您打算在Unix上将lower_case_table_names系统变量设置为1,则必须先将旧数据库和表名称转换为小写,然后再停止mysqld并使用新变量设置重新启动它。 要为单个表执行此操作,请使用RENAME TABLE:


RENAME TABLE T1 TO t1;



要转换一个或多个整个数据库,请在设置lower_case_table_names之前转储它们,然后删除数据库,并在设置lower_case_table_names后重新加载它们:


1.使用mysqldump,dump 每个数据库:


mysqldump --databases db1 > db1.sql

mysqldump --databases db2 > db2.sql ...



为每个必须重新创建的数据库执行此操作。


2.使用DROP DATABASE 删除每个数据库。


3.停止服务器,设置lower_case_table_names,然后重新启动服务器。


4.重新加载每个数据库的转储文件。 由于设置了lower_case_table_names,因此每个数据库和表名将在重新创建时转换为小写字母:


mysql < db1.sql

mysql < db2.sql

...


如果对象名称的大写形式根据二进制排序规则相等,则可以将其视为重复项。 对于游标名称,条件,程序,函数,保存点,存储的例程参数,存储的程序局部变量和插件而言都是如此。 对于列,约束,数据库,分区,语句的名称使用PREPARE,表,触发器,用户和用户定义的变量并非如此。



文件系统区分大小写会影响INFORMATION_SCHEMA表的字符串列中的搜索。



9.2.3 标识符到文件名称的映射


数据库和表标识符与文件系统中的名称之间存在对应关系。 对于基本结构,MySQL将数据库中的每个数据库表示为数据目录中的一个目录,每个表由相应数据库目录中的一个或多个文件组成。 对于表格格式文件(.FRM),数据总是存储在此结构和位置中。



对于数据和索引文件,磁盘上的确切表示是存储引擎特定的。 这些文件可能存储在与FRM文件相同的位置,或者信息可能存储在单独的文件中。 InnoDB数据存储在InnoDB数据文件中。 如果您将表空间与InnoDB一起使用,则使用您创建的特定表空间文件。



除ASCII ASCII NUL(X'00')外,任何字符在数据库或表标识符中都是合法的。 MySQL在创建数据库目录或表文件时对相应文件系统对象中存在问题的任何字符进行编码:


  • 基本拉丁字母(a..zA..Z),数字(0..9)和下划线(_)按原样编码。 因此,其区分大小写直接取决于文件系统功能。
  • 大写/小写映射的所有其他国家字母都按照下表所示进行编码。 “代码范围”列中的值为UCS-2值。







序列中的一个字节编码lettercase。 例如:LATIN CAPITAL LETTER A WITH GRAVE编码为@ 0G,而LATIN小编A WITH GRAVE编码为@ 0g。 这里第三个字节(G或g)表示lettercase。 (在不区分大小写的文件系统上,这两个字母将被视为相同。)


对于某些块(例如Cyrillic),第二个字节决定了lettercase。 对于其他块,例如Latin1 Supplement,第三个字节决定了lettercase。 如果序列中的两个字节是字母(如希腊语扩展中所示),则最左侧的字母表示lettercase。 所有其他字母字节必须小写。



  • 下划线(_)以外的所有非字母字符以及不具有大写/小写映射的字母(如希伯来语)中的字母都使用十六进制数字表示的小写字母进行编码a..f:



0x003F -> @003f

0xFFFF -> @ffff


十六进制值对应于ucs2双字节字符集中的字符值。



在Windows上,某些名称(如nul,prn和aux)通过在服务器创建相应文件或目录时将@@@附加到名称上进行编码。 这发生在所有平台上,以便平台之间的相应数据库对象的可移植性。



如果您的数据库或表格来自早于5.1.6的MySQL版本,其中包含特殊字符并且基础目录名称或文件名称尚未更新为使用新编码,则服务器将显示其名称,其前缀为#mysql50#在来自INFORMATION_SCHEMA表或SHOW语句的输出中。 例如,如果您有一个名为a@b的表,并且其名称编码尚未更新,则SHOW TABLES将显示如下所示:


mysql> SHOW TABLES;


+----------------+

| Tables_in_test |

+----------------+

| #mysql50#a@b |

+----------------+


要引用编码尚未更新的名称,您必须提供#mysql50#前缀:



mysql> SHOW COLUMNS FROM `a@b`; ERROR 1146 (42S02): Table 'test.a@b' doesn't exist

mysql> SHOW COLUMNS FROM `#mysql50#a@b`;

+-------+---------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-------+---------+------+-----+---------+-------+

| i | int(11) | YES | | NULL | |

+-------+---------+------+-----+---------+-------+


要更新旧名称以消除使用特殊前缀引用它们的需要,请使用mysqlcheck对它们进行重新编码。 以下命令将所有名称更新为新编码:


mysqlcheck --check-upgrade --all-databases

mysqlcheck --fix-db-names --fix-table-names --all-databases



要仅检查特定数据库或表,请忽略--all-databases并提供适当的数据库或表参数。


注意:

#mysql50#前缀仅用于服务器内部使用。 您不应创建名称使用此前缀的数据库或表。


此外,mysqlcheck无法修复包含用于编码特殊字符的@字符的文字实例的名称。 如果您有包含此字符的数据库或表,请在升级到MySQL 5.1.6或更高版本之前使用mysqldump转储它们,然后在升级后重新加载转储文件。



注意:

将包含特殊字符的pre-MySQL 5.1数据库名称转换为5.1格式并添加#mysql50#前缀将被弃用,并且将在未来版本的MySQL中删除。 由于此类转换不推荐使用,因此mysqlcheck的--fix-db-names和--fix-table-names选项以及ALTER DATABASE语句的UPGRADE DATA DIRECTORY NAME子句也被弃用。


仅从一个版本系列到另一个版本(例如,5.0到5.1或5.1到5.5)支持升级,因此应该只需要将较旧的5.0数据库名称转换为当前版本的。 作为一种解决方法,在升级到最新版本之前,升级5.0到5.1.



9.2.4 函数名称解析


MySQL支持内置(本机)函数,用户定义函数(UDF)和存储函数。 本节介绍服务器如何识别内置函数的名称是用作函数调用还是用作标识符,以及服务器如何确定在给定名称中存在不同类型的函数时使用哪个函数。




内置函数名称解析


解析器使用默认规则来分析内置函数的名称。 这些规则可以通过启用IGNORE_SPACE SQL模式进行更改。



当分析器遇到一个单词是内置函数的名称时,它必须确定名称是表示函数调用,还是表示对表名或列名等标识符的非表达式引用。 例如,在以下语句中,count的第一个引用是一个函数调用,而第二个引用是一个表名:


SELECT COUNT(*) FROM mytable;

CREATE TABLE count (i INT);


解析器应该只在解析期望的表达式时才将内建函数的名称识别为指示函数调用。 也就是说,在非表达式上下文中,函数名称被允许作为标识符。



但是,某些内置函数具有特殊的解析或实现注意事项,因此解析器默认使用以下规则来区分它们的名称是用作函数调用,还是用作非表达式上下文中的标识符:


  • 要将该名称用作表达式中的函数调用,名称和后面(括号字符 之间不得有空格。
  • 相反,要使用函数名称作为标识符,不能立即使用括号。





在名称和括号之间没有空白的情况下编写函数调用的要求仅适用于有特殊注意事项的内置函数。 COUNT就是这样一个名字。 sql/lex.h源文件列出了这些特殊函数的名称,其后面的空格确定了它们的解释:由 symbols[]数组中的SYM_FN()宏定义的名称。


在MySQL 5.7中,大约有30个这样的函数名称。 您可能会发现,将无空白要求视为适用于所有函数调用是最优的。


以下列表列出受IGNORE_SPACE设置影响并在sql / lex.h源文件中列为特殊功能的函数。


  • ADDDATE
  • BIT_AND
  • BIT_OR
  • BIT_XOR
  • CAST
  • COUNT
  • CURDATE
  • CURTIME
  • DATE_ADD
  • DATE_SUB
  • EXTRACT
  • GROUP_CONCAT
  • MAX
  • MID
  • MIN
  • NOW
  • POSITION
  • SESSION_USER
  • STD
  • STDDEV
  • STDDEV_POP
  • STDDEV_SAMP
  • SUBDATE
  • SUBSTR
  • SUBSTRING
  • SUM
  • SYSDATE
  • SYSTEM_USER
  • TRIM
  • VARIANCE
  • VAR_POP
  • VAR_SAMP



对于没有在sql/lex.h中列出的函数,空白不重要。 它们仅在用于表达式上下文时被解释为函数调用,否则可以作为标识符自由使用。 ASCII就是这样一个名字。 但是,对于这些不受影响的函数名称,解释在表达式上下文中可能会有所不同:如果函数名称中有func_name()被解释为内置函数, 如果不存在,则func_name()被解释为用户定义的函数或存储的函数(如果存在该名称的话)。


IGNORE_SPACE SQL模式可用于修改解析器如何处理空白敏感的函数名称:



  • 禁用IGNORE_SPACE时,解析器在名称和随后的括号之间没有空格时将该名称解释为函数调用。 即使在非表达式上下文中使用函数名时也会发生这种情况:



mysql> CREATE TABLE count(i INT); ERROR 1064 (42000): You have an error in your SQL syntax ... near 'count(i INT)'


要消除错误并将名称作为标识符处理,请在名称后面使用空格或将其写为带引号的标识符(或都使用):


CREATE TABLE count (i INT);

CREATE TABLE `count`(i INT);

CREATE TABLE `count` (i INT);




  • 启用IGNORE_SPACE后,解析器将放松函数名称和下面的括号之间不存在空格的要求。 这为编写函数调用提供了更大的灵活性。 例如,以下任一函数调用都是合法的:



SELECT COUNT(*) FROM mytable;

SELECT COUNT (*) FROM mytable;



但是,启用IGNORE_SPACE也会产生副作用,解析器会将受影响的函数名称视为保留字(请参见第9.3节“关键字和保留字”)。 这意味着名称后面的空格不再表示将其用作标识符。 这个名字可以用在有或没有空格的函数调用中,但是在非表达式上下文中引起语法错误,除非它被引用。 例如,启用IGNORE_SPACE后,以下两种语句都会因语法错误而失败,因为解析器会将count解释为保留字:


CREATE TABLE count(i INT);

CREATE TABLE count (i INT);


要在非表达式上下文中使用函数名称,请将其写为带引号的标识符:


CREATE TABLE `count`(i INT);

CREATE TABLE `count` (i INT);



要启用IGNORE_SPACE SQL模式,请使用以下语句:


SET sql_mode = 'IGNORE_SPACE';


IGNORE_SPACE还可以通过某些其他复合模式(如ANSI)将其包括在其值中:

SET sql_mode = 'ANSI';



要最大限度地减少IGNORE_SPACE设置上SQL代码的依赖性,请使用以下准则:



  • 避免创建与内置函数具有相同名称的UDF或存储函数。
  • 避免在非表达式上下文中使用函数名称。 例如,这些语句使用count(受IGNORE_SPACE影响的受影响的函数名称之一),因此如果启用IGNORE_SPACE,它们会在名称后面加上或不加空格符后失败:



CREATE TABLE count(i INT);

CREATE TABLE count (i INT);


如果您必须在非表达式上下文中使用函数名称,请将其写为带引号的标识符:


CREATE TABLE `count`(i INT);

CREATE TABLE `count` (i INT);


函数名称解析


以下规则描述了服务器如何解析函数名称对函数创建和调用的引用:


  • 内置函数和用户定义的函数

如果尝试使用与内置函数相同的名称创建UDF,则会发生错误。


  • 内置的功能和存储的函数


可以创建一个与内置函数具有相同名称的存储函数,但为了调用存储函数,需要使用方案名称来限定存储函数。 例如,如果在test方案中创建名为PI的存储函数,请将其作为test.PI()进行调用,因为服务器将PI()没有限定符解析为对内置函数的引用。 如果存储的函数名称与内置函数名称冲突,则服务器会生成警告。 该警告可以用SHOW WARNINGS显示。



  • 用户定义的函数和存储的函数



用户定义的函数和存储的函数共享相同的名称空间,因此您不能创建具有相同名称的UDF和存储函数。


上述函数名称解析规则对升级到实现新内置函数的MySQL版本有影响:


  • 如果您已经创建了具有给定名称的用户定义函数并将MySQL升级到实现具有相同名称的新内置函数的版本,则UDF将变得无法访问。 若要更正此问题,请使用DROP FUNCTION删除UDF和CREATE FUNCTION以重新创建具有不同非冲突名称的UDF。 然后修改任何受影响的代码以使用新名称。
  • 如果新版本的MySQL实现了与现有存储函数名称相同的内置函数,则有两种选择:重命名存储函数以使用非冲突名称,或者更改对函数的调用,以便它们使用模式限定符 (即,使用schema_name.func_name()语法)。 无论如何,都要相

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69946831/viewspace-3162258/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-09-09

  • 博文量
    2646
  • 访问量
    42316