更新时间:2026-10-21 GMT+08:00
分享

处理字符串数据类型

在处理SQL中的字符串数据类型(如varchar、text)时,ecpg提供了两种声明宿主变量的方式:常规C语言char[]数组与扩展的VARCHAR伪结构体类型。

使用字符数组

char[]是C语言中最通用的字符处理方式:

EXEC SQL BEGIN DECLARE SECTION;
    char str[50];
EXEC SQL END DECLARE SECTION;

使用时必须严格预留C语言字符串终止符'\0'的空间。在上述声明中,str最多仅能容纳49个字节的有效字符。若该变量用于接收查询结果,且数据库返回的字符串有效长度超过49字节,将触发缓冲区溢出(Buffer Overflow)越界风险。

使用VARCHAR

VARCHAR是ecpg提供的预编译扩展类型。在预处理阶段,VARCHAR数组声明会被自动转换并展开为一个包含长度字段与字符数组的C语言结构体。例如:

VARCHAR var[180];

会被ecpg预编译器转译为:

struct varchar_var 
{ 
    int len; 
    char arr[180]; 
} var;

其中:

  • arr字段表示存储以空字符'\0'结尾的实际字符串内容。
  • len字段表示存储arr中字符串的有效字节长度(计算时不包含末尾的'\0'终止符)。

输入传参长度校验:当VARCHAR宿主变量作为查询的输入参数时,若strlen(arr)计算出的实际长度与len记录的数值不匹配,ecpg运行时将自动取两者中的较小者作为实际传入数据库的字符长度。

  • 无论是char[]还是VARCHAR类型的宿主变量,除了绑定SQL字符串字段外,均可以用来接收或传入其他非字符类的SQL数据(如integer、numeric、timestamp等)。在数据交换过程中,这些非字符数值会被自动格式化为对应的字符串文本。
  • VARCHAR关键字必须全大写(VARCHAR)或全小写(varchar),严禁大小写混合(如VarChar)。

相关文档