Firebird数据库
Firebird数据库语言参考--常量
2023-03-15 16:22:29


常量是直接在SQL语句中提供的值,而不是从表达式、参数、列引用或变量。可以是字符串,也可以是数字。



字符串常量是包含在一对撇号(“单引号”)之间的一系列字符。最大字符串长度为32,767字节;最大字符数将由每个字符编码占用的字节数决定。

 

请注意
双引号不能用于引用字符串。SQL为它们保留了不同的用途。
•如果字符串常量中需要一个撇号,则通过在它前面加上另一个撇号来“转义”。
比如,'Mother O''Reilly's home-made hooch'。
•如果要将值写入VARCHAR列,则应注意字符串长度。最大VARCHAR的长度是32,765字节。
字符串常量的字符集被假定为与其目标存储的字符集相同。

十六进制表示法中的字符串常量
从Firebird 2.5开始,字符串文字可以以十六进制表示法输入,即所谓的“二进制字符串”。每对十六进制数字定义字符串中的一个字节。以这种方式输入的字符串将具有默认情况下的字符集OCTETS,但引入器语法可用于强制将字符串解释为另一个字符集。

语法:
{x|X}'<hexstring>'
<hexstring>> ::= an even number of <hexdigit>
<hexdigit> ::= one of 0..9, A..F, a..f
例子:
select x'4E657276656E' from rdb$database
-- returns 4E657276656E, a 6-byte 'binary' string
select _ascii x'4E657276656E' from rdb$database
-- returns 'Nerven' (same string, now interpreted as ASCII text)
select _iso8859_1 x'53E46765' from rdb$database
-- returns 'Säge' (4 chars, 4 bytes)
select _utf8 x'53C3A46765' from rdb$database
-- returns 'Säge' (4 chars, 5 bytes)


注意
客户端接口决定如何向用户显示二进制字符串。例如,isql实用程序,使用大写字母A-F,而FlameRobin使用小写字母。其他客户端程序可以使用其他惯例,例如在字节对之间显示空格:'4E 65 72 76 65 6E'。
十六进制表示法允许在字符串的任何位置插入任何字节值(包括00)。
但是,如果您希望将其强制为OCTETS以外的任何内容,则有责任提供字节的序列在目标字符集中有效的。
字符串文本的介绍器语法
如有必要,字符串文本前面可以带有字符集名称,字符集名称本身带有下划线“_”前缀。
这称为介绍器语法。其目的是通知引擎如何解释和存储
例子

INSERT INTO People
VALUES (_ISO8859_1 'Hans-Jörg Schäfer')

 


数字常量是受支持表示法中的任何有效数字:
• 在 SQL 中,对于标准十进制表示法中的数字,小数点始终用句点(句号,点)字符和千不分离。包含逗号、空白等。会导致错误。
• 支持指数表示法。例如,0.0000234 可以表示为 2.34e-5。
• Firebird 2.5 及更高版本支持十六进制表示法 - 见下文。

 


从 Firebird 2.5 开始,整数值可以用十六进制表示法输入。带有 1-8 个十六进制数字的数字
将被解释为整数类型;带有 9-16 个十六进制数字的数字,类型 BIGINT。
语法:

0{x|X}<hexdigits>
<hexdigits> ::= 1-16 of <hexdigit>
<hexdigit> ::= one of 0..9, A..F, a..f
Examples:
select 0x6FAA0D3 from rdb$database -- returns 117088467
select 0x4F9 from rdb$database -- returns 1273
select 0x6E44F9A8 from rdb$database -- returns 1850014120
select 0x9E44F9A8 from rdb$database -- returns -1639646808 (an INTEGER)
select 0x09E44F9A8 from rdb$database -- returns 2655320488 (a BIGINT)
select 0x28ED678A4C987 from rdb$database -- returns 720001751632263
select 0xFFFFFFFFFFFFFFFF from rdb$database -- returns -1

 


• 十六进制数的范围是0..7FFF FFFF 是正整数,值介于 0..2147483647之间的十进制。要将数字强制到 BIGINT,请预置足够的零以使十六进制数字的总数,九个或以上。这会更改类型,但不会更改值。
• 在8000 0000 和FFFF FFFF之间的十六进制数需要注意:
- 当用八个十六进制数字写入时,如0x9E44F9A8,值被解释为 32 位整数。因为设置最左边的位(符号位),它映射到负范围 -2147483648 ..-1 十进制。
- 在前面加上一个或多个零,如0x09E44F9A8,一个值被解释为 64 位 BIGINT 在范围 0000 0000 8000 0000 ..0000 0000 FFFF FFFF.符号位现在未设置,因此它们映射到正范围2147483648..4294967295十进制。

因此,在此范围内(并且仅在此范围内),在数学上无关紧要的 0 前面加上一个完全不同的值。这是需要注意的。
• 介于 1 0000 0000 之间的十六进制数 ..7FFF FFFF FFFF 都是积极的 BIGINT。
• 介于 8000 0000 0000 0000 之间的十六进制数 ..FFFF FFFF FFFF 都是负面的 BIGINT。
• 严格来说,SMALLINT 不能用十六进制编写,因为即使是 0x1 也被计算为 INTEGER。然而如果在 16 位范围内写入正整数 0x0000(十进制零)到 0x7FFF(十进制 32767)它将透明地转换为 SMALLINT。
可以使用范围内的 4 字节十六进制数以十六进制写入负 SMALLINT 0xFFFF8000(十进制 -32768)到 0xFFFFFFFF(十进制 -1)。

 

本文由海钛瑞OA办公系统研发团队翻译制作,转载请在开始处标明来自于http://www.hitai.com.欢迎交流。