一、标识符
标识符由字母或下划线()开头,标识符中的后续字符可以是字母、下划线、数字或美元符号。请注意,根据SQL标准的字母,标识符中不允许使用美元符号,因此使用它们可能会使应用程序的可移植性降低。
标识符最长为NAMEDATALEN-1,NAMEDATALEN默认是64,因此标识符最长为63字节。标识符不区分大小写,约定关键字大写,其余小写。
第二种标识符:由双引号括起来的标识符。这种标识符不是关键字而是普通的标识符。带引号的标识符可以包含任何字符,但是不能是空。对大小写敏感。引用标识符的变体允许包含由其代码点标识的转义Unicode 字符。此变体在开始双引号之前以U&(大写或小写U后跟&号)开头,中间没有任何空格,例如 U&"foo"。(请注意,这会与运算符 & 产生歧义。在运算符周围使用空格以避免此问题。)在引号内,可以通过编写反斜杠后跟四位十六进制代码点编号或以转义形式指定Unicode字符或者,反斜杠后跟加号,后跟六位十六进制代码点编号。
如果需要与反斜杠不同的转义字符,可以在字符串后使用 UECAPE 子句指定,例如:
U&"d!0061t!+000061" UESCAPE '!'
转义字符可以是除十六进制数字、加号、单引号、双引号或空白字符之外的任何单个字符。请注意,转义字符在 UECAPE 之后用单引号而不是双引号编写。
二、常量
PostgreSQL 中有三种隐式类型常量:字符串、位字符串和数字。常量也可以用显式类型指定,这可以使系统更准确的表示和更有效的处理。
字符串
SQL 中的字符串常量是由单引号 (') 限定的任意字符序列,例如“这是一个字符串”。要在字符串常量中包含单引号字符,请写入两个相邻的单引号,例如,'Dianne''s horse'。请注意,这与双引号字符 (") 不同。
仅由空格分隔且至少有一个换行符的两个字符串常量被连接起来,并被有效地视为字符串已被写为一个常量。例如:
PostgreSQL 还接受“转义”字符串常量,这是对 SQL 标准的扩展。转义字符串常量通过在开始单引号之前写入字母 E(大写或小写)来指定,例如 E'foo'。(跨行继续转义字符串常量时,仅在第一个开始引号之前写 E。)在转义字符串中,反斜杠字符 () 开始类似 C 的反斜杠转义序列,其中反斜杠和后续字符 (s) 表示一个特殊的字节值。反斜杠后面的任何其他字符都按字面意思表示。因此,要包含反斜杠字符,请编写两个反斜杠 (\)。此外,除了通常的 '' 之外,还可以通过写 ' 将单引号包含在转义字符串中。
虽然指定字符串常量的标准语法通常很方便,但当所需的字符串包含许多单引号或反斜杠时,可能很难理解,因为它们中的每一个都必须加倍。为了在这种情况下允许更易读的查询,PostgreSQL 提供了另一种方法,称为“美元引用”,用于写入字符串常量。用美元引用的字符串常量由一个美元符号 ($)、一个可选的零个或多个字符的“标记”、另一个美元符号、构成字符串内容的任意字符序列、一个美元符号、相同的标记组成开始这个美元报价,和一个美元符号。例如,这里有两种使用美元引号指定字符串“Dianne's horse”的不同方法:
$$Dianne's horse$$ $SomeTag$Dianne's horse$SomeTag$
请注意,在美元引用的字符串中,可以使用单引号而无需转义。事实上,美元引号字符串中的任何字符都不会被转义:字符串内容总是按字面意思书写。反斜杠不是特殊的,美元符号也不是特殊的,除非它们是与开始标签匹配的序列的一部分。
美元引号不是 SQL 标准的一部分,但它通常是一种比符合标准的单引号语法更方便的方式来编写复杂的字符串文字。当在其他常量中表示字符串常量时,它特别有用,这在过程函数定义中经常需要。
位字符串
位串常量看起来像常规字符串常量,在开始引号(没有中间空格)之前带有 B(大写或小写),例如 B'1001'。位串常量中允许的唯一字符是 0 和 1。或者,可以使用前导 X(大写或小写)以十六进制表示法指定位串常量,例如 X'1FF'。这种表示法相当于一个位串常量,每个十六进制数字有四个二进制数字。两种形式的位串常量都可以像常规字符串常量一样跨行继续。美元引号不能用于位串常量。
数字常量
格式为:
digits digits.[digits][e[+-]digits] [digits].digits[e[+-]digits] digitse[+-]digits
其中digits 是一个或多个十进制数字(0 到9)。如果使用一位,则必须在小数点之前或之后至少有一位。指数标记 (e) 后必须至少有一位数字,如果存在的话。常量中不能嵌入任何空格或其他字符。请注意,任何前导加号或减号实际上都不被视为常数的一部分;它是应用于常量的运算符。
一个既不包含小数点也不包含指数的数字常量如果其值适合整数类型(32 位),则最初假定它是integer;否则,如果它的值适合 bigint 类型(64 位),则假定它是 bigint 类型;否则它被认为是numeric。包含小数点和/或指数的常量最初总是假定为numeric。
数字常量最初分配的数据类型只是类型解析算法的起点。在大多数情况下,常量将根据上下文自动强制转换为最合适的类型。必要时,您可以强制将数值转换为特定的数据类型。
其他类型常量
type 'string' 'string'::type CAST ( 'string' AS type )
将'string'指定为type 类型
注释