基础篇!MySQL的标识符语法命名规则大小写规则
Posted 多栖技术控小董
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础篇!MySQL的标识符语法命名规则大小写规则相关的知识,希望对你有一定的参考价值。
一、mysql的标识符语法、命名规则
- MySQL的标识符必须遵循以下几条规则
标识符里的字符要合法
- 不加引号的标识符可以由大小写形式的字母a-z、数字0-9、美元符号、下划线,以及范围在U+0080到U+FFFF之间的Unicode扩展字符构成。
- 标识符的第一个字符可以是标识符所允许的任何一种字符,其中包括数字。
- 不过,不加引号的标识符不允许完全由数字字符构成:
- 因为那样会使它难以与数字区分开来。MySQL支持标识符以数字字符开头的做法,在各类数据库系统中并不常见。
- 如果想要使用这样的标识符,那么必须特别留意它是否还包含了一个“E”或“e”字符,因为这种组合很容易导致表达式出现歧义。
- 例如,表达式23e + 14(在“+”号的两边都有空格)表示的是列23e加上数字14,那么23e+14又该如何解释呢 ?它表示的是同一件事,还是一个用科学计数法表示的数字呢?
- 标识符可以用反引号“`”引起来,它支持使用除NULL字节和Unicode补充字符(范围在U+10000及以上)以外的任何字符:
- 如果标识符是SQL保留字,或者包含有空格或其他特殊字符,那么引号就会很有用。
- 为标识符加上引号 ,可以让它完全由数字字符构成;这一点对不加引号的标识符来说是不允许的。
- 如果想在一个加上引号的标识符里使用标识符的引号字符,那么只需把重复一下即可。
CREATE TABLE `my table` ( `my-int-column` INT );
- 对于数据库名和表名这样的标识符,操作系统可能会有其他的一些限制。更多相关信息在后面介绍"数据目录结构"时会讲解。
- 列名和表名的别名没什么限制。如果要使用的别名是SQL保留字,或者完全由数字构成,或者包含空格或其他特殊字符,那么应该用标识符引号把它引起来。列的别名还可以使用单引号或双引号。
服务器的SQL模式
如果启用了SQL的ANSI_QUOTES模式,那么可以使用双引号将标识符引起来(也可以使用反引号),例如:
CREATE TABLE "my table"( "my-int-column" INT );
- 启用ANSI_QUOTES会有副作用,即字符串文字量必须使用单引号引起来。如果使用了双引号 ,那么服务器会将这个值解释为标识符,而不会把它当作一个字符串。
- 内建函数的名字通常都不是保留字,因此可以不加引号直接将其用作标识符。不过,如果启用了 SQL的IGNORE_SPACE模式,那么函数名就会变成保留字。这时,如果想要把它们当作标识符,则必须使用引号将它们引起来 。
标识符的长度
- 大部分标识符的最大长度是64字符。别名的最大长度是256个字符。
标识符的限定符
根据具体的上下文,标识符可能需要加以限定,以明确它所引用的是什么内容。如果想要引用数据库,那么只需直接指定其名字即可:
USE db_name; SHOW TABLES FROM dn_name;
如果想要引用表,则有两种选择:
- 使用一个完全限定的表名,即用数据库标识符和表标识符共同指定(下面代码段1所示)
- 表标识符自己可以引用默认(当前)数据库里的表。例如sampdb是默认数据库,那么下面代码段2所示的两条语句是等效的
SHOW COLUMNS FROM db_name.tbl_name; SELECT * FROM db_name tbl_name;
SHOW * FROM member; SHOW * FROM sampdb.member;
- 如果没有选择数据库,那么在没有给出数据库限定符的情况下引用某个表,就会出现错误;因为还不知道这个表到底属于哪个数据库。
- 表名加上限定符的原因同样适用于视图(它们是“虚拟 ”表)和存储程序的名字。
- 对于表列的引用,有如下3种选择:
- 使用完全限定的列名:dn_name.tbl_name.col_name
- 对于默认数据库中命名表里的某一个列,可以使用部分限定名:tbl_name.col_name
- 只简单地写一个无限定名来引用具体环境上下文所确定的那个表:下面两条查询语句都使用了相同的列名,但每条语句的FROM子句所提供的上下文会指出,实 际应该选择哪个表里的列:
SELECT last_name, first_name FROM president; SELECT last_name, first_name FROM member;
- 如果在引用一个完全限定名时使用了引号,那么需要给该名字里的每一个标识符分别加上引号。例如:
SELECT * FROM `sampdb`.`member` WHERE `sampdb`,`member`,`member_id`>100;
- 请不要把这种名字当作一个整体用引号引起来。下面这条语句是不正确的:
SELECT * FROM `sampdb.member` WHERE `sampdb`,`member`,`member_id`>100;
- 如果需要把某个保留字用作标识符,那么必须给它加上引号。不过当这个保留字紧跟在一个句号 限定符后面时,则不能这样做,因为这时的上下文已说明这个保留字其实就是一个标识符。
二、SQL语句大小写规范
- SQL语句中的大小写规则因语句各个组成元素的不同而有所差异,同时还取决于你正引用的内容和MySQL服务器主机所运行的操作系统。
SQL关键字和函数名
- SQL的那些关键字和函数名不区分大小写。它们可以为任意的大小写组合。
- 例如,下面的语句都是等价的:
SELECT NOW(); SELECT now(); SELECT nOw();
数据库名、表名和视图名
- MySQL使用了服务器主机上的底层文件系统所包含的目录和文件来表示数据库和表。因此,库 名和表名的默认大小写取决于服务器主机上的操作系统在文件名方面的规定:
- Windows系统的文件名不区分大小写,所以运行在它上面的MySQL服务器也不区分库名和表名的大小写。
- 而运行于Unix主机上的MySQL服务器,通常需要区分库名和表名的大小写,因为Unix文件系统区分大小写。
- 对于MacOSX平台,其扩展文件系统中的名字是个例外,它们不区分大小写。
- 例如,下面是在Linux操作系统下的MySQL,我们选择DEMO数据库失败
MySQL会使用一个文件来表示一个视图,所以刚才与表有关的讨论也同样适用于视图 。
存储程序的名字
- 存储函数、存储过程和事件的名字都不区分大小写。
- 触发器的名字要区分大小写,这一点与标准SQL的行为有所不同。
列名和索引名
- 在MySQL里,列名和索引名都不区分大小写。
- 下面这些语句都是等价的:
SELECT name FROM student; SELECT NAME FROM student; SELECT nAme FROM student;
别名的名字
- 默认情况下,表的别名要区分大小写。可以使用任意的大小写组合(大写、小写或大小写混用)来指定一个别名。但如果需要在同一条语句里多次用到同一个别名,则必须让它们保持同样的大小写组合。
- 如果lower_case_table_names系统变量为非零值 ,那么表的别名将不区分大小写。
字符串值
- 字符串值是否区分大小写,具体取决于它是二进制还是非二进制串,并且对于非二进制串,还取决于字符集的排序规则(collation)。对于文字串和字符串类型列的内容,这一点也同样成立。更多相关信息请参考https://dongshao.blog.csdn.net/article/details/87366045。
- 当你在一台文件名区分大小写的机器上创建数据库和表时,应该要认真考虑一下大小写的问题,如“它们以后是否有可能会迁移到一台不区分文件名大小写的机器上”。
- 想要避免大小写问题演变成一个棘手难题,可行的办法是:先选定一种大小写方案,然后一直按照该方案去创建数据库 和表。个人建议统一使用小写字母,尤其是,如果你要使用InnoDB表的话,因为InnoDB引擎在其内部都是以小写字母方式来存储数据库名和表名的。
- 如果想统一使用小写字母来创建数据库名和表名,即使在CREATE语句里没有特意指定, 也想要这样的效果,那么可以通过设置lower_case_table_name系统变量来配置服务器。在后面介绍"数据目录结构"时会讲解。
以上是关于基础篇!MySQL的标识符语法命名规则大小写规则的主要内容,如果未能解决你的问题,请参考以下文章