html { font-family: sans-serif }
body { margin: 0 }
article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary { display: block }
audio,canvas,progress,video { display: inline-block; vertical-align: baseline }
audio:not([controls]) { display: none; height: 0 }
[hidden],template { display: none }
a { background: transparent }
a:active,a:hover { outline: 0 }
abbr[title] { border-bottom: 1px dotted }
b,strong { font-weight: bold }
dfn { font-style: italic }
h1 { font-size: 2em; margin: 0.67em 0 }
mark { background: #ff0; color: #000 }
small { font-size: 80% }
sub,sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline }
sup { top: -0.5em }
sub { bottom: -0.25em }
img { border: 0 }
svg:not(:root) { overflow: hidden }
figure { margin: 1em 40px }
hr { height: 0 }
pre { overflow: auto }
code,kbd,pre,samp { font-family: monospace, monospace; font-size: 1em }
button,input,optgroup,select,textarea { color: inherit; font: inherit; margin: 0 }
button { overflow: visible }
button,select { text-transform: none }
button,html input[type="button"],input[type="reset"],input[type="submit"] { cursor: pointer }
button[disabled],html input[disabled] { cursor: default }
button::-moz-focus-inner,
input::-moz-focus-inner { border: 0; padding: 0 }
input { line-height: normal }
input[type="checkbox"],input[type="radio"] { padding: 0 }
input[type="number"]::-webkit-inner-spin-button,
input[type="number"]::-webkit-outer-spin-button { height: auto }
input[type="search"] { }
input[type="search"]::-webkit-search-cancel-button,
input[type="search"]::-webkit-search-decoration { }
fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em }
legend { border: 0; padding: 0 }
textarea { overflow: auto }
optgroup { font-weight: bold }
table { border-collapse: collapse; border-spacing: 0 }
td,th { padding: 0 }
* { }
*::before,*::after { }
html { font-size: 62.5% }
body { font-family: "Helvetica Neue", Helvetica, Arial, "Microsoft Yahei", sans-serif; font-size: 14px; line-height: 1.42857143; color: #333333 }
input,button,select,textarea { font-family: inherit; font-size: inherit; line-height: inherit }
a { color: #428bca; text-decoration: none }
a:hover,a:focus { color: #2a6496; text-decoration: underline }
a:focus { outline: 5px auto -webkit-focus-ring-color }
figure { margin: 0 }
img { vertical-align: middle }
.hljs { display: block; 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; 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 }
本文为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)