返回首页

gbase数据、南大通用产品文档:GBase8s获取并插入字符数据类型

更新日期:2024年09月11日

您可以使用以下任一操作在 CHAR 和 VARCHAR 列以及字符(char 、string 、
fixchar 、varchar 或 lvarchar)主机变量之间传输字符数据:
提取操作将字符数据从 CHAR 或 VARCHAR 列传输到字符主机变量。
插入或更新操作将字符主机变量传输到 CHAR 、VARCHAR 或 LVARCHAR 列。

如果使用区域设置敏感字符数据类型(NCHAR 或 NVARCHAR),则还可以在
NCHAR 或 NVARCHAR 列和字符主机变量之间传输字符数据。
获取并插入 CHAR 数据
当应用程序使用字符主机变量插入或获取 CHAR 值时,GBase 8s ESQL/C 必须保证
字符值适合主机变量或数据库列。
获取 CHAR 数据
应用程序可以从 CHAR 或 VARCHAR 类型的数据库列获取数据到字符(char 、
string 、fixchar 、varchar 或 lvarchar)主机变量中。如果列数据不符合字符主机变量,
则 GBase 8s ESQL/C 会截断此数据。要通知用户截断,GBase 8s ESQL/C 执行下列操作:

将 sqlca.sqlwarn.sqlwarn1 警告标记设置为 W 并将 SQLSTATE 变量设置为 01004。

它将与字符主机变量关联的任何指示变量设置为列中的字符数据的大小。
插入 CHAR 数据
应用程序可以将字符主机变量(char 、string 、fixchar 、varchar 或 lvarchar)中
的数据插入到 CHAR 类型的数据库列。
如果该值小于数据库列的大小,
则数据库服务器将
使用空格填充到该列大小的值。

如果值大于列的大小,则数据库服务器截断值(如果数据库为非 ANSI)。发生截断
时不会产生警告。如果数据库是 ANSI 并且值大于列的长度,则插入失败并返回此错误:

-1279: Value exceeds string column length.

尽管 char 、
varchar 、
lvarchar 和 string 主机变量包含空终止符,
GBase 8s ESQL/C
不会将这些字符插入到数据库列。(fixchar 类型的主机变量绝对不能包含空终止符。)

如果使用区域设置敏感的数据类型( NCHAR),则可以将字符主机变量中的值插入
NCHAR 列。插入 NCHAR 列的方式与插入到 CHAR 列的行为相同。


GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 97 -

不要将 fixchar 数据类型用于将字符数据插入到符合 ANSI 的数据库中的主机变量。

获取并插入 VARCHAR 数据
当应用程序使用字符主机变量插入或获取 VARCHAR 值时,GBase 8s ESQL/C 必须
确保字符值适合主机变量或数据库列。当 GBase 8s ESQL/C 计算源条目的长度时,它不计
算尾部的空格。以下部分将介绍 GBase 8s ESQL/C 如何执行将 VARCHAR 数据转换为
char 、fixchar 和 string 字符数据类型。

这些转换也适用于 NVARCHAR 数据。
获取 VARCHAR 数据
下表显示了当应用程序将其读取为 char 、fixchar 、lvarchar 和 string 和字符串数
据类型的主机变量时,VARCHAR 数据的转换。

表 3. 将 VARCHAR 数据类型转换为 ESQL/C 字符数据类型
源类型
目标类型
结果
VARCHA
R
char
如果源类型比较长,则截断并使用 null 终止,并设置任
何指示变量。如果目标类型更长,则用尾部空格填充该值,并
将其终止。
VARCHA
R
fixchar
如果源类型比较长,
则截断该值并设置任何指示变量。

果目标类型更长,则用尾部空格填充该值。
VARCHA
R
string
如果源类型比较长,则截断该值并使用 null 终止,并设
置任何指示变量。如果目标类型更长,则使用 null 终止该值。

VARCHA
R
lvarchar
如果源类型比较长,
则截断该值并设置任何指示变量。

果目标类型更长,则 null 终止该值。

下面的表显示了在获取期间 GBase 8s ESQL/C 可能执行的从 VARCHAR 列数据到
字符主机变量的转换示例。
在该表中,
加号
(+)
表示空格字符,
长度列中的值包括任何 null
终止符。

表 4. 获取期间的 VARCHAR 转换示例
源类型
内容
长度
目标类型
内容
指示符
VARCHAR(
9)
Fairfield
9
char(5)
Fair\0
9
VARCHAR(
9)
Fairfield
9
char(12)
Fairfield++\0
0
VARCHAR(
Fairfield+
12
char(10)
Fairfield\0
12

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 98 -

源类型
内容
长度
目标类型
内容
指示符
12)
++
VARCHAR(
10)
Fairfield+
10
char(4)
Fai\0
10
VARCHAR(
11)
Fairfield+
+
11
char(14)
Fairfield++++\
0
0
VARCHAR(
9)
Fairfield
9
fixchar(
5)
Fairf
9
VARCHAR(
9)
Fairfield
9
fixchar(
10)
Fairfield+
0
VARCHAR(
10)
Fairfield+
10
fixchar(
9)
Fairfield
10
VARCHAR(
10)
Fairfield+
10
fixchar(
6)
Fairfi
10
VARCHAR(
10)
Fairfield+
10
fixchar(
11)
Fairfield++
0
VARCHAR(
9)
Fairfield
9
string(4)
Fai\0
9
VARCHAR(
9)
Fairfield
9
string(1
2)
Fairfield\0
0
VARCHAR(
12)
Fairfield+
++
12
string(1
0)
Fairfield\0
12
VARCHAR(
11)
Fairfield+
+
11
string(6)
Fairf\0
11
VARCHAR(
10)
Fairfield+
+
10
string(1
1)
Fairfield\0
0
VARCHAR(
10)
Fairfield+
10
lvarchar
(11)
Fairfield+
0
VARCHAR(
9)
Fairfield
9
lvarchar
(5)
Fair\0
9

插入 VARCHAR 数据
当应用程序将 char 、
varchar 、
lvarchar 和 string 主机变量的值插入到 VARCHAR
列时,GBase 8s ESQL/C 还会插入任何尾随空格。但是,GBase 8s ESQL/C 则不会添加尾
随空格。

如果该值大于数据库列的最大大小,则数据库服务器截断该值(如果数据库为非

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 99 -

ANSI)。发生截断时不会产生警告。如果数据库是 ANSI 并且值大于列的长度,则插入失
败并返回此错误:
-1279: Value exceeds string column length.

尽管 char 、
varchar 、
lvarchar 和 string 主机变量包含空终止符,
GBase 8s ESQL/C
不会将这些字符插入到数据库列。(fixchar 类型的主机变量绝对不能包含空终止符。)如
果应用程序将 char 、varchar 、lvarchar 和 string 值插入到 VARCHAR 列,则数据库
服务器将内部跟踪该值的末尾。

下表显示了当应用程序将其从 char 、varchar 、lvarchar 和 string 字符数据类型
的主机变量插入时, VARCHAR 数据的转换。

表 5. 将 ESQL/C 字符数据类型转换为 VARCHAR 数据类型
源类型
目标类型
结果
char
VARCH
AR
如果源类型大于 VARCHAR 的最大值,则截断该值并设置指
示变量。如果 VARCHAR 的最大值大于原类型,则目标类型的长
度等于源类型的长度(不包含源类型的空终止符)。
fixcha
r
VARCH
AR
如果源类型大于 VARCHAR 的最大值,则截断该值并设置指
示变量。如果 VARCHAR 的最大值大于原类型,则目标类型的长
度等于源类型的长度。
string
VARCH
AR
如果源类型大于 VARCHAR 的最大值,则截断该值并设置指
示变量。如果 VARCHAR 的最大值大于原类型,则目标类型的长
度等于源类型的长度(不包含源类型的空终止符)。
lvarch
ar
VARCH
AR
如果源类型大于 VARCHAR 的最大值,则截断该值并设置指
示变量。如果 VARCHAR 的最大值大于原类型,则目标类型的长
度等于源类型的长度。

如果使用区域设置敏感的数据类型( NVARCHAR),则可以将字符主机变量中的值
插入 NVARCHAR 列。
插入 NVARCHAR 列的方式与插入到 VARCHAR 列的行为相同。


下表显示了在插入期间 GBase 8s ESQL/C 可能执行的从 VARCHAR 列数据到字符
主机变量的转换示例。在该表中,加号(+)表示空格字符。

表 6. 插入期间 VARCHAR 转换的示例
源类型
内容
长度
目标类型
内容
长度
char(10)
Fairfield\0
10
VARCHAR(
Fair
4

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 100 -

源类型
内容
长度
目标类型
内容
长度
4)
char(10)
Fairfield\0
10
VARCHAR(
11)
Fairfield
9
char(12)
Fairfield++\0
12
VARCHAR(
9)
Fairfield
9
char(13)
Fairfield+++\0
13
VARCHAR(
6)
Fairfi
6
char(11)
Fairfield+\0
11
VARCHAR(
11)
Fairfield
+
10
fixchar(9)
Fairfield
9
VARCHAR(
3)
Fai
3
fixchar(9)
Fairfield
9
VARCHAR(
11)
Fairfield
9
fixchar(11)
Fairfield++
11
VARCHAR(
9)
Fairfield
9
fixchar(13)
Fairfield++++
13
VARCHAR(
7)
Fairfie
7
fixchar(10)
Fairfield+
10
VARCHAR(
12)
Fairfield
+
10
string(9)
Fairfield\0
9
VARCHAR(
4)
Fair
4
string(9)
Fairfield\0
9
VARCHAR(
11)
Fairfield
9

获取和插入 lvarchar 数据
当应用程序使用 lvarchar 主机变量获取或插入数据值时,
GBase 8s ESQL/C 必须确保
该值适合主机变量或数据库列。
获取 lvarchar 数据
应用程序可以从 LVARCHAR 类型的数据库列获取数据到字符(char 、string 、
fixchar 、varchar 或 lvarchar)主机变量中。如果列数据不符合字符主机变量,则 GBase
8s ESQL/C 会截断此数据。要通知用户截断,GBase 8s ESQL/C 执行下列操作:
将 sqlca.sqlwarn.sqlwarn1 警告标记设置为 W 并将 SQLSTATE 变量设置为 01004。

它将与字符主机变量关联的任何指示变量设置为列中的字符数据的大小。
插入 lvarchar 数据
应用程序可以将字符主机变量(char 、string 、fixchar 、varchar 或 lvarchar)中

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 101 -

的数据插入到 LVARCHAR 类型的数据库列。

如果该值大于数据库列的大小,
则数据库服务器截断该值
(如果数据库为非 ANSI)

发生截断时不会产生警告。如果数据库是 ANSI 并且值大于列的长度,则插入失败并返回
此错误:
-1279: Value exceeds string column length.

如果您使用的插入的主机变量是 char 或 varchar免责数据库服务器强制转型为
lvarchar 类型。

当向 LVARCHAR 列写入数据时,数据库服务器在列上施加了 32 KB 的限制。如果
主机变量 lvarchar 数据类型。并且数据超过 32 KB,则数据库服务器返回错误。如果列
具有输入支持功能,
则它必须使用超过 32 KB 的任何数据,
以防止数据库服务器返回错误。

在符合 ANSI 的数据库中获取或插入
对于符合 ANSI 的数据库,
当在 INSERT 语句或 SQL 语句
(SELECT 、
UPDATE 或
DELETE)的 WHERE 子句中使用字符主机变量时,主变量中的字符必须为空终止符。因
此,对于字符主机变量,使用以下数据类型:
char 、string 或 varchar
lvarchar

例如,下面的插入时有效的,因为第一个和最后一个主机变量时 char 类型,是空终
止符:
EXEC SQL BEGIN DECLARE SECTION;
char first[16], last[16];
EXEC SQL END DECLARE SECTION;


stcopy("Dexter", first);
stcopy("Haven", last);
EXEC SQL insert into customer (fname, lname)
values (:first, :last);


stcopy() 函数将空终止符复制到主机变量中,char 数据类型保留空终止符。

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 102 -



不要对主机变量使用 fixchar 数据类型,因为它不能在字符串中包含空终止符。对于
符合 ANSI 的数据库。数据库服务器会在以下任一情况下生成错误:
如果尝试插入不是空终止符的字符串
如在 WHERE 子句中使用不是空终止符的字符串

NCHAR 数据类型存储固定长度字符数据。该数据可以是单字节或多字节字母、数字
和受数据库语言环境的代码集支持的其他符号组成的字符串。
CHAR 与 NCHAR 数据类型之间的主要差别在于整理顺序。
CHAR 数据类型的整理顺序遵循代码集顺序,但 NCHAR 数据类型的整理顺序可以是本
地化的顺序,前提是 DB_LOCALE(或 SET COLLATION)指定定义了本地化整理顺序的语言
环境。
NCHAR 数据类型声明中的大小规范可能受字符类型声明中的逻辑字符语义一节中描述
的 SQL_LOGICAL_CHAR 配置参数影响。
在使用 NLSCASE INSENSITIVE 属性创建的数据库中,对 NCHAR 字符串的操作会忽略
字母大小写,从而在对数据值排序时不管字母大小写。例如,在查询返回的整理列表中,
NCHAR 字符串 "IDS" 可能位于 "IdS" 或 "iDs" 之前或之后,
具体取决于检索这些数据字
符串的顺序,因为以下所有 NCHAR 字符串会被视为重复值:
"ids" "IDS" "idS" "IDs" "IdS" "iDs" "iDS" "Ids"

删除审计日志
要删除审计日志件,操作如下:


GBase 8s 审计工具用户手册
南大通用数据技术股份有限公司
- 20 -


进入查看审计日志的界面。

在查看日志页面中,输入指定的时间段,然后单击“删除”按钮,完成数据的删除
操作。