*/

.hljs {
display: block;
overflow-x: auto;
padding: 0.5em;
color: #333;
background: #f8f8f8;
}

.hljs-comment,
.hljs-template_comment,
.diff .hljs-header,
.hljs-javadoc {
color: #998;
font-style: italic;
}

.hljs-keyword,
.css .rule .hljs-keyword,
.hljs-winutils,
.javascript .hljs-title,
.nginx .hljs-title,
.hljs-subst,
.hljs-request,
.hljs-status {
color: #333;
font-weight: bold;
}

.hljs-number,
.hljs-hexcolor,
.ruby .hljs-constant {
color: #099;
}

.hljs-string,
.hljs-tag .hljs-value,
.hljs-phpdoc,
.tex .hljs-formula {
color: #d14;
}

.hljs-title,
.hljs-id,
.coffeescript .hljs-params,
.scss .hljs-preprocessor {
color: #900;
font-weight: bold;
}

.javascript .hljs-title,
.lisp .hljs-title,
.clojure .hljs-title,
.hljs-subst {
font-weight: normal;
}

.hljs-class .hljs-title,
.haskell .hljs-type,
.vhdl .hljs-literal,
.tex .hljs-command {
color: #458;
font-weight: bold;
}

.hljs-tag,
.hljs-tag .hljs-title,
.hljs-rules .hljs-property,
.django .hljs-tag .hljs-keyword {
color: #000080;
font-weight: normal;
}

.hljs-attribute,
.hljs-variable,
.lisp .hljs-body {
color: #008080;
}

.hljs-regexp {
color: #009926;
}

.hljs-symbol,
.ruby .hljs-symbol .hljs-string,
.lisp .hljs-keyword,
.tex .hljs-special,
.hljs-prompt {
color: #990073;
}

.hljs-built_in,
.lisp .hljs-title,
.clojure .hljs-built_in {
color: #0086b3;
}

.hljs-preprocessor,
.hljs-pragma,
.hljs-pi,
.hljs-doctype,
.hljs-shebang,
.hljs-cdata {
color: #999;
font-weight: bold;
}

.hljs-deletion {
background: #fdd;
}

.hljs-addition {
background: #dfd;
}

.diff .hljs-change {
background: #0086b3;
}

.hljs-chunk {
color: #aaa;
}

#container {
padding: 15px;
}
pre {
border: 1px solid #ccc;
border-radius: 4px;
display: block;
background-color: #f8f8f8;
}
pre code {
white-space: pre-wrap;
}
.hljs,
code {
font-family: Monaco, Menlo, Consolas, 'Courier New', monospace;
}
:not(pre) > code {
padding: 2px 4px;
font-size: 90%;
color: #c7254e;
background-color: #f9f2f4;
white-space: nowrap;
border-radius: 4px;
}
-->

本文为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)

翻译:Identifier Name标识符命名规则的更多相关文章

  1. 【Java】标识符 & 命名规则

    Java的标识符和命名规则 什么是标识符[Identifier]? 指用来标识某个实体的一个符号.在不同的应用环境下有不同的含义. 在编程语言中,标识符是开发者编程时使用的名字,对于变量.常量.函数. ...

  2. Java第二天——标识符命名规则、Java的知识、快捷键的使用、Scanner获取值的常用方法

    1.标识符命名规则 字母.下划线.数字.美元符号($)由这四个部分组成. 标识符=首字母+其他 首字母:字母.下划线.美元符号($) 其他:字母.下划线.数字.美元符号($) 注意: 1.首字母不能为 ...

  3. C++之关键字&标识符命名规则

    关键字 **作用:**关键字是C++中预先保留的单词(标识符) * **在定义变量或者常量时候,不要用关键字** C++关键字如下: 提示:在给变量或者常量起名称时候,不要用C++得关键字,否则会产生 ...

  4. Golang的标识符命名规则

    Golang的标识符命名规则 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.关键字 1>.Go语言有25个关键字 Go语言的25个关键字如下所示: break,defau ...

  5. 2.6 C#的标识符命名规则

    C#标识符的命名规则 程序中的变量名.常量名.类名.方法名,都叫做标识符.C#有一套标识符的命名规则,如果命名时不遵守规则,就会出错.这套规则简单说有下面三条: ①标识符只能由英文字母.数字和下划线组 ...

  6. JAVA初学者——标识符命名规则及数据类型的转换

    Hello!我是浩宇大熊猫~ 直接进入正题吧~ 1)标识符的命名规则. 标识符命名法有小驼峰命名法和大驼峰命名法两种,分别应用于方法.变量和类. 小驼峰命名法应用于方法和变量,主要有两个约定: 1.标 ...

  7. 【原创】Python第二章——标识符命名规则

    在Python中,一切都是对象,包括常量数据类型,如整数数据类型(1,2,3...),字符串数据类型("ABC").想要使用这些对象,就要使用它的对象引用.赋值操作符,实际上是使得 ...

  8. java 标识符命名规则

    标识符:就是给类,接口,方法,变量等起名字. 组成规则: A:英文字母大小写 B:数字字符 C:$和_ 注意事项: A:不能以数字开头 B:不能是Java中的关键字 C:Java语言严格区分大小写 包 ...

  9. JAVA基础篇NO1--环境变量的配置及命名规则

    标签(空格分隔): java基础 一:计算机概述 计算机:硬件和软件 硬件:控制器 运算器 存储器 输入和输出设备       存储器:外存(硬盘) 内存 软件:系统软件 应用软件   系统软件:wi ...

随机推荐

  1. C#中抽象类和接口的区别2

    1.接口是为了满足外部调用而定义的一个功能约定, 因此反映的是事物的外部特性        抽象类是从一系列相关对象中抽象出来的概念, 因此反映的是事物的内部共性:       2. 下面分别从声明, ...

  2. 《天书夜读:从汇编语言到windows内核编程》二 C语言的流程与处理

    1) Debug与Release的区别:前者称调试版,后者称发行版.调试版基本不优化,而发行版会经过编译器的极致优化,往往与优化前的高级语言执行流程会大相径庭,但是实现的功能是等价的. 2) 如下fo ...

  3. Git文件状态描述

    检查当前文件状态 [root@typhoeus79 ice_test_m git_test]# git status # On branch master nothing to commit (wor ...

  4. Redis学习-内存优化

    以下为个人学习Redis的备忘录--内存优化 1.随时查看info memory,了解内存使用状况:127.0.0.1:6379> info memory# Memoryused_memory: ...

  5. javaweb-番外篇-Commons-FileUpload组件上传文件

    一.Commons-FileUpload简介 Commons-FileUpload组件 Commons是Apache开放源代码组织的一个Java子项目,其中的FileUpload是用来处理HTTP文件 ...

  6. Struts2-045验证脚本

    #! /usr/bin/env python # encoding:utf-8 import urllib2 import sys from poster.encode import multipar ...

  7. 极光推送_总结_01_Java实现极光推送

    一.代码实现 1.配置类—Env.java package com.ray.jpush.config; /**@desc : 极光推送接入配置 * * @author: shirayner * @da ...

  8. 用Vim 加密文本

    Vim强大就在于 可以干任何想要做的事情,比如加密.Fedora 18上给大家做一个测试.首先安装 vim: sudo yum install vim -y然后检验模块是否有加密: vim --ver ...

  9. Swarm 如何存储数据?- 每天5分钟玩转 Docker 容器技术(103)

    service 的容器副本会 scale up/down,会 failover,会在不同的主机上创建和销毁,这就引出一个问题,如果 service 有要管理的数据,那么这些数据应该如何存放呢? 选项一 ...

  10. leetcode series:Two Sum

    题目: Given an array of integers, find two numbers such that they add up to a specific target number. ...