2
货币类型
money
类型存储固定小数精度的货币数字,参阅
表
7.2.1
。小数的精度由数据库的
lc_monetary
设置决定。表
中展示的范围假设有两个小数位。可接受的输入格式很多,包括整数和浮点数文字,以及常用的货币格式,
如
'$1,000.00'
。输出通常是最后一种形式,但和区域相关。
表
7.2.1:
货币类型
名字
存储尺寸
描述
范围
money
8 bytes
货币额
-92233720368547758.08
到
+92233720368547758.07
由于这种数据类型的输出是区域敏感的,因此将
money
数据装入到一个具有不同
lc_monetary
设置的
数据库是不起作用的。为了避免这种问题,在恢复一个转储到一个新数据库中之前,应确保新数据库的
lc_monetary
设置和被转储数据库的相同或者具有等效值。
数 据 类 型
numeric
、
int
和
bigint
的 值 可 以 被 造 型 成
money
。 从 数 据 类 型
real
和
double
precision
的转换可以通过先造型成
numeric
来实现,例如:
SELECT
'12.34'
::float8::numeric::money;
但是,我们不推荐这样做。浮点数不应该被用来处理货币,因为浮点数可能会有圆整错误。
一个
money
值可以在不损失精度的情况下被造型成
numeric
。转换到其他类型可能会丢失精度,并且必
须采用两个阶段完成:
SELECT
'52093.89'
::money::numeric::float8;
一个
money
值被一个整数值除的除法结果会被截去分数部分。要得到圆整的结果,可以除以一个浮点值,
或者在除法之前把
money
转换成
numeric
然后在除法之后转回
money
(如果要避免精度丢失的风险则
后者更好)。当一个
money
值被另一个
money
值除时,结果是
double precision
(即一个纯数字,而
不是金额),在除法中货币单位被约掉了。
3
字符类型
表
7.3.1:
字符类型
名字
描述
character varying(n [char | byte]
),
varchar(n [char | byte]
)
有限制的变长
character(n [char | byte]
),
char(n [char | byte]
)
定长,空格填充
text
无限变长
clob
字符大对象
nclob
字符大对象
表
7.3.1
显示了在
KingbaseES
里可用的一般用途的字符类型。
SQL
定义了两种基本的字符类型:
character varying(n [char | byte]
)
和
character(n [char
| byte]
)
,其中
“n“
是一个正整数。两种类型都可以存储最多
“n“
个字符长的串。试图存储更长的串到这些类
型的列里会产生一个错误,除非超出长度的字符都是空白,这种情况下该串将被截断为最大长度(这个看上
去有点怪异的例外是
SQL
标准要求的)。如果要存储的串比声明的长度短,类型为
character
的值将会用
空白填满;而类型为
character varying
的值将只是存储短些的串。
如果我们明确地把一个值造型成
character varying(n [char | byte]
)
或者
character(n
)
,那
么超长的值将被截断成
“n [char | byte]“
个字符,而不会抛出错误(这也是
SQL
标准的要求)。
varchar(n [char | byte]
)
和
char(n [char | byte]
)
的概念分别是
character varying(n
[char | byte]
)
和
character(n [char | byte]
)
的别名。没有长度声明词的
character
等效于
character(1)
。如果不带长度说明词使用
character varying
,那么该类型接受任何长度的串。后者
是一个
KingbaseES
的扩展。
char
或
byte
的默认值由默认值由
NLS_LENGTH_SEMANTICS
确定,显式指定
的“
byte
”和“
char
”修饰会覆盖
NLS_LENGTH_SEMANTICS
参数指定的长度。
另外,
KingbaseES
提供
text
类型,它可以存储任何长度的串。尽管类型
text
不是
SQL
标准,但是许多
其它
SQL
数据库系统也有它。
类型
character
的值物理上都用空白填充到指定的长度
“n“
,并且以这种方式存储和显示。不过,拖尾
的空白被当作是没有意义的,并且在比较两个
character
类型值时不会考虑它们。在空白有意义的排序
规则中,这种行为可能会产生意料之外的结果,例如
SELECT 'a '::CHAR(2) collate "C" < E'a\
n'::CHAR(2)
会返回真(即便
C
区域会认为一个空格比新行更大)。当把一个
character
值转换成其他
字符串类型之一时,拖尾的空白会被移除。请注意,在
character varying
和
text
值里,结尾的空白
语意上是有含义的,并且在使用模式匹配(如
LIKE
和正则表达式)时也会被考虑。
这些类型的存储需求是
4
字节加上实际的字串,如果是
character
的话再加上填充的字节。长的字串将会自动
被系统压缩,因此在磁盘上的物理需求可能会更少些。长的数值也会存储在后台表里面,这样它们就不会干
扰对短字段值的快速访问。不管怎样,允许存储的最长字串大概是
1 GB
。(允许在数据类型声明中出现的的
n
的最大值比这还小。修改这个行为没有甚么意义,因为在多字节编码下字符和字节的数目可能差别很大。
如果你想存储没有特定上限的长字串,那么使用
text
或者没有长度声明词的
character varying
,而不要选择一
个任意长度限制。)一个短串(最长
126
字节)的存储要求是
1
个字节外加实际的串,该串在
character
情况下包含填充的空白。长一些的串在前面需要
4
个字节而不是
1
个字节。长串会被系统自动压缩,这样在
磁盘上的物理需求可能会更少。非常长的值也会被存储在背景表中,这样它们不会干扰对较短的列值的快速
访问。在任何情况下,能被存储的最长的字符串是
1GB
(数据类型定义中
“n“
能允许的最大值比这个值要小。
修改它没有用处,因为对于多字节字符编码来说,字符的数量和字节数可能完全不同。如果你想要存储没有
指定上限的长串,使用
text
或没有长度声明的
character varying
,而不是给出一个任意长度限制)。
Tip:
这三种类型之间没有性能差别,只不过是在使用填充空白的类型的时候需要更多存储尺寸,以及
在存储到一个有长度约束的列时需要少量额外
CPU
周期来检查长度。虽然在某些其它的数据库系统里,
character(n
)
有一定的性能优势,但在
KingbaseES
里没有。事实上,
character(n
)
通常是这三种类
型之中最慢的一个,因为它需要额外的存储开销。在大多数情况下,应该使用
text
或者
character
varying
。
请参考
字符串常量
获取关于串文本的语法的信息,及参阅
函数和操作符
获取关于可用操作符和函数的信息。
数据库的字符集决定用于存储文本值的字符集;有关字符集支持的更多信息,请参考 字符集支持。
character[(n [char | byte])]
a.
别名:
char[(n [char | byte])]
b.
说明:定长字符串,如果显式指定了
char
,则以字符为单位;如果显式指定了
byte
,则以字节为单位;
如果没有显式指定,则以系统参数
nls_length_semantics
为准,若系统参数
nls_length_semantics
为
char
,
则以字符为单位,否则以字节为单位。
n
缺省为
1
。
c.
值域:定长,不足定义长度时在最右边以空格补齐。
n
的最大值为
10485760
。如果字符串的长度超出
n
,则
按照
SQL
标准截断
(
超出部分都是空格
)
或报错。若显式指定了
char
,则
char(n char)
最长
n
个字符;若显
式指定了
byte
,则
char(n byte)
最长
n
个字节;若没有显式指定,则以系统参数
nls_length_semantics
为准,
如果系统参数
nls_length_semantics
值为
char
,则
char(n)
最长
n
个字符,如果系统参数
nls_length_semantics
值是
byte
,则
char(n)
最长
n
个字节。默认系统参数
nls_length_semantics
的值是
char
。
d.
用例:
1) nls_length_semantics
为缺省是
char
的情况
set nls_length_semantics
为
='char';
create table test_default_char (col char(4));
(continues on next page)
(continued from previous page)
insert into test_default_char values ('1234');
insert into test_default_char values ('12345');
ERROR:
用于类型字符
(4)
的值过长
insert into test_default_char values ('
一二
');
insert into test_default_char values ('
一二三
');
select col, length(col) from test_default_char;
COL | LENGTH
---------+--------
1234 |
4
一二
|
2
一二三
|
3
2) nls_length_semantics
缺省是
byte
的情况
set nls_length_semantics
为
='byte';
create table test_default_byte (col char(4));
insert into test_default_byte values ('1234');
insert into test_default_byte values ('12345');
ERROR:
用于类型字符
(4 byte)
的值过长
insert into test_default_byte values ('
一
');
insert into test_default_byte values ('
一二三
');
ERROR:
用于类型字符
(4 byte)
的值过长
select col, length(col) from test_default_byte;
COL | LENGTH
------+--------
1234 |
4
一
|
1
显式指定是
byte
的情况
create table test_byte (col char(4 byte));
insert into test_byte values ('1234');
insert into test_byte values ('12345');
ERROR:
用于类型字符
(4 byte)
的值过长
insert into test_byte values ('
一
');
insert into test_byte values ('
一二三
');
ERROR:
用于类型字符
(4 byte)
的值过长
select col, length(col) from test_byte;
COL | LENGTH
------+--------
1234 |
4
一
|
1
3)
显式指定是
char
的情况
create table test_char (col char(4 char));
insert into test_char values ('1234');
insert into test_char values ('12345');
ERROR:
用于类型字符
(4)
的值过长
insert into test_char values ('
一二三四
');
insert into test_char values ('
一二三四五
');
ERROR:
用于类型字符
(4)
的值过长
select col, length(col) from test_char;
COL | LENGTH
----------+--------
1234
|
4
一二三四
|
4
使用此数据类型创建列存储表的情况
(continues on next page)
(continued from previous page)
当
nls_length_semantics
为 缺省是
char
时:
set nls_length_semantics='char';
create table test_default_char (col char(4));
文件“
c:\
”中内容如下:
1234
12345
执行语句:
copy test_default_char from 'c:\';
ERROR: value too long for type char varying(4)
CONTEXT: COPY test_default_char, line 2, column col: "12345"
character varying[(n [char | byte])]
a.
别名:
varchar[(n [char | byte])]
,
varchar2[(n [char | byte])]
,
nvarchar2[(n [char | byte])]
,
nvarchar[(n [char |
byte])]
b.
说明:变长字符串,如果显式指定了
char
,则以字符为单位;如果显式指定了
byte
,则以字节为单位;
如果没有显式指定,则以系统参数
nls_length_semantics
为准,若系统参数
nls_length_semantics
为
char
,
则以字符为单位,否则以字节为单位。
n
缺省为
1
。
c.
值域:变长,有长度限制。字符串长度小于
n
时不在字符串右边用空格补齐。
n
的最大值为
10485760
。
如果字符串的长度超出
n
,则按照
SQL
标准截断(超出部分都是空格)或报错。若显式指定了
char
,
则
varchar(n char)
最长
n
个字符;若显式指定了
byte
,则
varchar(n byte)
最长
n
个字节;若没有显式指
定,则以系统参数
nls_length_semantics
为准,如果系统参数
nls_length_semantics
值为
char
,则
varchar(n)
最长
n
个字符,若系统参数
nls_length_semantics
值是
byte
,则
varchar(n)
最长
n
个字节,默认系统参数
nls_length_semantics
的值是
byte
。
d.
用例:
1) nls_length_semantics
缺省是
char
的情况
set nls_length_semantics='char';
create table test_default_varchar (col varchar(4));
insert into test_default_varchar values ('1234');
insert into test_default_varchar values ('12345');
ERROR:
类型
VARCHAR(4)
的值过长
insert into test_default_varchar values ('
一二
');
insert into test_default_varchar values ('
一二三
');
select col, length(col) from test_default_varchar;
COL | LENGTH
--------+--------
1234 |
4
一二
|
2
一二三
|
3
2) nls_length_semantics
缺省是
byte
的情况
set nls_length_semantics='byte';
create table test_default_varbyte (col varchar(4));
insert into test_default_varbyte values ('1234');
insert into test_default_varbyte values ('12345');
ERROR:
类型
VARCHAR(4 byte)
的值过长
insert into test_default_varbyte values ('
一
');
insert into test_default_varbyte values ('
一二三
');
ERROR:
类型
VARCHAR(4 byte)
的值过长
select col, length(col) from test_default_varbyte;
COL | LENGTH
------+--------
(continues on next page)
(continued from previous page)
1234 |
4
一
|
1
3)
显式指定是
byte
的情况
create table test_varbyte (col varchar(4 byte));
insert into test_varbyte values ('1234');
insert into test_varbyte values ('12345');
ERROR:
类型
VARCHAR(4 byte)
的值过长
insert into test_varbyte values ('
一
');
insert into test_varbyte values ('
一二三
');
ERROR:
类型
VARCHAR(4 byte)
的值过长
select col, length(col) from test_varbyte;
COL | LENGTH
------+--------
1234 |
4
一
|
1
4)
显式指定是
char
的情况
create table test_varchar (col varchar(4 char));
insert into test_varchar values ('1234');
insert into test_varchar values ('12345');
ERROR:
类型
VARCHAR(4)
的值过长
insert into test_varchar values ('
一二三四
');
insert into test_varchar values ('
一二三四五
');
ERROR:
类型
VARCHAR(4)
的值过长
select col, length(col) from test_varchar;
COL | LENGTH
----------+--------
1234
|
4
一二三四
|
4
使用此数据类型创建列存储表的情况
nls_length_semantics
缺省是
char
的情况
set nls_length_semantics='char';
create table test_default_varchar (col varchar(4));
文件“
c:\
”中内容如下:
1234
12345
执行语句:
copy test_default_varchar from 'c:\';
ERROR: value too long for type character varying(4)
CONTEXT: COPY test_default_varchar, line 2, column col: "12345"
例
7-1.
使用字符类型
CREATE TABLE test1 (a character(
4
));
INSERT INTO test1 VALUES (
'ok'
);
SELECT a, char_length(a) FROM test1;
--
[a]_
a
|
char_length
------+-------------
ok
|
2
CREATE TABLE test2 (b varchar(
5
));
INSERT INTO test2 VALUES (
'ok'
);
INSERT INTO test2 VALUES (
'good
'
);
(continues on next page)
(continued from previous page)
INSERT INTO test2 VALUES (
'too long'
);
ERROR: value too long
for
type
character varying(
5
)
INSERT INTO test2 VALUES (
'too long'
::varchar(
5
));
--
explicit truncation
SELECT b, char_length(b) FROM test2;
b
|
char_length
-------+-------------
ok
|
2
good
|
5
too l
|
5
在
KingbaseES
里另外还有两种定长字符类型,在
表
7.3.2
里显示。
name
类型只用于在内部系统目录中存储
标识符并且不是给一般用户使用的。该类型长度当前定为
64
字节(
63
可用字符加结束符)但在
C
源代码应
该使用常量
NAMEDATALEN
引用。这个长度是在编译的时候设置的(因而可以为特殊用途调整),缺省的最
大长度在以后的版本可能会改变。类型
"char"
(注意引号)和
char(1)
是不一样的,它只用了一个字节的
存储空间。它在系统内部用于系统目录当做简化的枚举类型用。
表
7.3.2:
特殊字符类型
名字
存储尺寸
描述
"char"
1
字节
单字节内部类型
name
64
字节
用于对象名的内部类型