Skip to content

标识符和关键字

什么是标识符和关键字?

在SQL语言中,我们会遇到两种重要的元素:标识符关键字

  • 标识符:用来命名数据库对象的名称,比如表、列、视图等。它们就像是给数据库中的"东西"起的名字。
  • 关键字:SQL语言中具有特定含义的保留单词,如SELECTUPDATEINSERT等。

从形式上看,它们非常相似,如果不了解SQL语法,很难区分一个词是标识符还是关键字。

标识符的规则

基本规则

标识符必须遵循以下规则:

  1. 开头字符:必须以字母(a-z,包括带变音符号的字母和非拉丁字母)或下划线(_)开头
  2. 后续字符:可以包含字母、下划线、数字(0-9)或美元符号($)
  3. 长度限制:PostgreSQL默认最多允许63个字节长度的标识符(由NAMEDATALEN参数控制)

💡 小贴士:虽然SQL标准允许使用美元符号,但这可能影响应用程序的跨数据库可移植性。

标识符的两种类型

SQL中存在两种形式的标识符:

1. 普通标识符(不带引号)

sql
my_table
column_name
user_id

特点

  • 不区分大小写(在PostgreSQL中会被自动转换为小写)
  • 不能与关键字冲突(除非加引号)

2. 带分隔符的标识符(带引号)

sql
"my-table"
"column name"
"SELECT"  -- 即使是关键字也可以用作标识符

特点

  • 区分大小写
  • 可以包含几乎任何字符,包括空格
  • 可以使用关键字作为标识符名称

标识符大小写示例对比

不带引号带引号是否相同
foo"foo"相同 ✓
FOO"foo"相同 ✓
Foo"Foo"不同 ✗
foo"FOO"不同 ✗

⚠️ 注意:PostgreSQL中不带引号的标识符会转为小写,而SQL标准规定应转为大写。为了编写可移植的应用程序,建议要么始终对特定名称使用引号,要么永远不用引号。

Unicode字符与转义序列

PostgreSQL支持在带引号的标识符中使用Unicode字符,方法是使用U&前缀:

sql
-- 使用Unicode转义序列
U&"d\0061t\+000061"  -- 等同于 "data"

-- 使用西里尔字母(俄语"大象")
U&"\0441\043B\043E\043D"

如果需要使用其他转义字符,可以指定UESCAPE

sql
U&"d!0061t!+000061" UESCAPE '!'  -- 使用!作为转义字符

关键字的特性

关键字是SQL语言预定义的、具有特殊含义的单词。它们用于构建SQL命令和查询。

例如SELECT, INSERT, UPDATE, DELETE, FROM, WHERE, JOIN等。

关键字的主要特性

  • 不区分大小写(SELECTselect相同)
  • 不能直接用作标识符,除非加引号
  • 完整的关键字列表可在PostgreSQL文档附录C中找到

标识符与关键字的最佳实践

为了提高代码可读性和一致性,推荐以下最佳实践:

  1. 命名约定:关键字使用大写,标识符使用小写

    sql
    SELECT column_name FROM my_table WHERE id = 5;
  2. 避免使用关键字作为标识符:即使可以通过引号使用关键字作为标识符,也应尽量避免这种做法

    sql
    -- 不推荐
    CREATE TABLE "table" (
      "select" integer
    );
    
    -- 推荐
    CREATE TABLE my_table (
      selected_value integer
    );
  3. 保持一致的引号使用风格:选择一种引号风格并在整个项目中保持一致

实际示例

sql
-- 创建表(使用不带引号的标识符)
CREATE TABLE students (
  id serial PRIMARY KEY,
  first_name varchar(50),
  last_name varchar(50),
  grade integer
);

-- 创建表(使用带引号的标识符,包含特殊字符)
CREATE TABLE "student-records" (
  "ID" serial PRIMARY KEY,
  "First Name" varchar(50),
  "Last Name" varchar(50),
  "Grade Level" integer
);

-- 查询数据(混合使用关键字和标识符)
SELECT first_name, last_name
FROM students
WHERE grade > 80;

通过理解标识符和关键字的规则,你可以更好地编写SQL查询,避免语法错误,同时提高代码的可读性和可维护性。