zoukankan      html  css  js  c++  java
  • 翻译:Identifier Name标识符命名规则

    本文为mariadb官方手册:Identifier Names的译文。

    原文:https://mariadb.com/kb/en/library/identifier-names/
    我提交到MariaDB官方手册的译文:https://mariadb.com/kb/zh-cn/library/identifier-names/

    Identifier Names

    数据库、表、索引、字段、别名、视图、存储过程、触发器、事件、变量分区、表空间、保存点、标签、用户、角色,都是常见的 标识符,它们都有特定的命名规则。

    标识符可以使用反引号字符"`"引起来。将标识符使用引号引用是可选的,除非标识符中包含特殊字符或保留关键字。如果将SQL_MODE设置为ANSI_QUOTES,则双引号(")也可以用来引用标识符。

    使用全名(fully qualified names)的时候无需引号引用标识符,即使名称中使用了保留关键字。例如,test.select只有一种解释,因此没有使用引号将保留字"select"包围时也能正确解析。

    无需引用的情况

    下面的字符都是有效的,它们不需要被引号引用:

    • ASCII: [0-9,a-z,A-Z$_] (数值0-9,大小写的拉丁字符,美元符号,下划线)
    • Extended: U+0080 .. U+FFFF

    需要引用的情况

    下面的字符是有效的,但是需要被引号引用:

    • ASCII: U+0001 .. U+007F (full Unicode Basic Multilingual Plane (BMP) except for U+0000)
    • Extended: U+0080 .. U+FFFF
    • 标识符自身也可以作为标识符的一部分,只要它们被引号引用即可。

    其他命名规则

    以下是标识符命名相关的其他规则:

    • 标识符以Unicode(UTF-8)格式存储。
    • 标识符可能会也可能不会区分大小写。见Indentifier Case-sensitivity
    • 数据库、表和字段名称不能以空白字符结尾。
    • 标识符名称可以以数值开头,但不能只包含数值,除非使用引号引用。
    • 以数值开头且后面跟字符"e"的标识符,需要使用引号引用,它们会被解析为浮点数值。
    • 标识符中不允许包含ASCII NUL(U+0000)字符和增补字符(U+10000或更大的值)。
    • 允许使用类似5e6、9e这样的标识符,但强烈建议不要使用它们,因为在特定的上下文中,它们会产生歧义而被当作一个数值或表达式。
    • 用户变量不能作为标识符的一部分,也不能直接作为SQL语句中的标识符。

    引用字符

    普通的引用字符使用的是反引号"`",但如果设置SQL_MODE为ANSI_QUOTES,则双引号(")也可作为引用字符。

    反引号可以作为标识符的一部分,但此时它需要被引用起来。引用字符可以是反引号,但这种情况下,反引号必须使用另一个反引号进行转义。

    最大长度

    • Databases, tables, columns, indexes, constraints, stored routines, triggers, events, views, tablespaces, servers和log file groups 最大允许64个字符。
    • 组合语句标签最大允许16个字符。
    • 别名最大允许256个字符。但CREATE VIEW语句中的字段别名最大允许64个字符(而非最大别名长度256字符)。
    • Users最大长度80个字符。
    • Roles最大长度128个字符。
    • 多字节字符不会计算超出字符长度限制之外的字符。

    组合标识符

    MariaDB允许使用单个字段名称来引用某个字段,只要它不会产生歧义,或者为字段指定表名,再或者加上数据库名使用3段标识符的方式来引用字段。使用句点(.)分隔各标识符,分隔符句点(.)前后可以包含空格(制表符、换行符)。

    示例

    使用句点分隔各标识符:

    CREATE TABLE t1 (i int);
    
    INSERT INTO t1(i) VALUES (10);
    
    SELECT i FROM t1;
    +------+
    | i    |
    +------+
    |   10 |
    +------+
    
    SELECT t1.i FROM t1;
    +------+
    | i    |
    +------+
    |   10 |
    +------+
    
    SELECT test.t1.i FROM t1;
    +------+
    | i    |
    +------+
    |   10 |
    +------+
    

    句点可以被空格分隔:

    SELECT test . t1 . i FROM t1;
    +------+
    | i    |
    +------+
    |   10 |
    +------+
    

    解决歧义:

    CREATE TABLE t2 (i int);
    
    SELECT i FROM t1 LEFT JOIN t2 ON t1.i=t2.i;
    ERROR 1052 (23000): Column 'i' in field list is ambiguous
    
    SELECT t1.i FROM t1 LEFT JOIN t2 ON t1.i=t2.i;
    +------+
    | i    |
    +------+
    |   10 |
    +------+
    

    创建一个需要被引号引用的表:

    CREATE TABLE 123% (i int);
    ERROR 1064 (42000): You have an error in your SQL syntax; 
      check the manual that corresponds to your MariaDB server version for the right syntax 
      to use near '123% (i int)' at line 1
    
    CREATE TABLE `123%` (i int);
    Query OK, 0 rows affected (0.85 sec)
    
    CREATE TABLE `TABLE` (i int);
    Query OK, 0 rows affected (0.36 sec)
    

    使用双引号作为引用字符:

    CREATE TABLE "SELECT" (i int);
    ERROR 1064 (42000): You have an error in your SQL syntax; 
      check the manual that corresponds to your MariaDB server version for the right syntax 
      to use near '"SELECT" (i int)' at line 1
    
    SET sql_mode='ANSI_QUOTES';
    Query OK, 0 rows affected (0.03 sec)
    
    CREATE TABLE "SELECT" (i int);
    Query OK, 0 rows affected (0.46 sec)
    

    将引用符号作为标识符名称的一部分:

    SHOW VARIABLES LIKE 'sql_mode';
    +---------------+-------------+
    | Variable_name | Value       |
    +---------------+-------------+
    | sql_mode      | ANSI_QUOTES |
    +---------------+-------------+
    
    CREATE TABLE "fg`d" (i int);
    Query OK, 0 rows affected (0.34 sec)
    

    创建名为"*"的表(Unicode number: U+002A),它需要被引用起来。

    CREATE TABLE `*` (a INT);
    

    浮点数歧义:

    CREATE TABLE 8984444cce5d (x INT);
    Query OK, 0 rows affected (0.38 sec)
    
    CREATE TABLE 8981e56cce5d (x INT);
    ERROR 1064 (42000): You have an error in your SQL syntax; 
      check the manual that corresponds to your MariaDB server version for the right syntax 
      to use near '8981e56cce5d (x INT)' at line 1
    
    CREATE TABLE `8981e56cce5d` (x INT);
    Query OK, 0 rows affected (0.39 sec)
    
  • 相关阅读:
    C++面试题
    kalman滤波原理
    开blog
    Linux图片批处理
    Debian使用相关
    Ubuntu grub引导修复
    Debian系统vim中文显示乱码问题
    Debian配置Apache2支持mod-python和cgi模块
    linux下解压被分割的zip文件
    Ubuntu 16.04 启动错误 "a start job is running for hold until boot process finishes up"
  • 原文地址:https://www.cnblogs.com/f-ck-need-u/p/7597849.html
Copyright © 2011-2022 走看看