Kingbase-数据类型2-货币类型&字符类型

本文详细介绍了KingbaseES数据库中的货币类型money,其存储精度、格式和转换规则,以及字符类型如charactervarying、varchar、text和字符大对象的特性、长度限制和存储行为。强调了字符类型中的长度敏感性和填充策略,以及如何处理不同长度和精度的数据转换。
摘要由CSDN通过智能技术生成
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:\file.txt ”中内容如下:
1234
12345
执行语句: copy test_default_char from 'c:\file.txt';
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:\file.txt ”中内容如下:
1234
12345
执行语句: copy test_default_varchar from 'c:\file.txt';
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 字节
用于对象名的内部类型
  • 17
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kingbase 中创建自定义数据类型需要使用 CREATE TYPE 语句,具体步骤如下: 1. 创建自定义数据类型 使用以下语句创建自定义数据类型 multipolygon: ``` CREATE TYPE multipolygon AS ( polygons polygon[] ); ``` 这里使用了 ARRAY 类型来存储多边形的列表,每个多边形使用 Kingbase 内置的 polygon 类型来表示。 2. 创建表 创建一个包含 multipolygon 类型字段的表: ``` CREATE TABLE mytable ( id serial primary key, geom multipolygon ); ``` 这里使用了 SERIAL 类型来自动生成 id,geom 字段使用了自定义的 multipolygon 类型。 3. 插入数据 插入数据时,可以使用 Kingbase 内置的 polygon 构造函数来创建多边形对象,然后将多个多边形对象组成的列表传递给自定义数据类型构造函数,来创建 multipolygon 类型的对象。例如: ``` INSERT INTO mytable (geom) VALUES ( ROW(ARRAY[ polygon '((0,0),(0,1),(1,1),(1,0),(0,0))', polygon '((2,2),(2,3),(3,3),(3,2),(2,2))' ]::polygon[]) ); ``` 这里使用了 ROW 类型来创建自定义数据类型的对象,ARRAY 类型用于创建多边形对象列表。 4. 查询数据 查询数据时,可以使用 Kingbase 内置的 polygon 函数和自定义函数来进行空间计算和查询。例如: ``` SELECT * FROM mytable WHERE ST_Intersects( ST_GeomFromText('POINT(0.5 0.5)', 4326), ST_ConvexHull(geom.polygons[1]) ); ``` 这里使用了 ST_GeomFromText 函数来创建点对象,ST_ConvexHull 函数来计算多边形的凸包,ST_Intersects 函数来判断点和凸包是否相交。 需要注意的是,自定义数据类型的使用需要您自己编写相关的函数和操作符来支持空间计算和查询,相对来说比较复杂。如果您需要频繁地操作空间数据,建议使用专门的空间数据库,如 PostGIS 或者 Oracle Spatial 等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值