测试使用字符串类型要注意的地方

本文通过创建表并插入数据,对比了CHAR与VARCHAR2两种字符类型的差异,并演示了如何正确使用绑定变量进行查询。
目的:了解字符串要怎么应用

测试:

SQL> create table t
  2  (char_column char(20),
  3  varchar2_column varchar2(20)
  4  )
  5  /

Table created.

SQL> insert into t values ('hello world','hello world');

1 row created.

SQL> select * from t;

CHAR_COLUMN          VARCHAR2_COLUMN
-------------------- --------------------
hello world          hello world
这里的CHAR_COLUMN列长度为20,自动把长度定死为20

SQL> select * from t where char_column = 'hello world';

CHAR_COLUMN          VARCHAR2_COLUMN
-------------------- --------------------
hello world          hello world

SQL> select * from t where varchar2_column = 'hello world';

CHAR_COLUMN          VARCHAR2_COLUMN
-------------------- --------------------
hello world          hello world

SQL> select * from t where char_column=varchar2_column;

no rows selected
这里虽然两列值从显示来看一模一样,但是并不相等,因为长度不一样

SQL> select * from t where trim(char_column) = varchar2_column;

CHAR_COLUMN          VARCHAR2_COLUMN
-------------------- --------------------
hello world          hello world

SQL> select * from t where char_column = rpad( varchar2_column, 20 );

CHAR_COLUMN          VARCHAR2_COLUMN
-------------------- --------------------
hello world          hello world
这里去掉CHAR列中的空格或者让VARCHAR2增加空格到长度为20时,这两列值就相等

使用绑定变量时要使用CHAR类型而不是VARCHAR2,为什么?

测试:以一使用VARCHAR2类型来进行绑定变量操作


SQL> variable varchar2_bv varchar2(20)
SQL> exec :varchar2_bv := 'hello world';

PL/SQL procedure successfully completed.

SQL> select * from t where char_column = :varchar2_bv;

no rows selected
这个时候长度不等,绑定变量不会成功
SQL> select * from t where varchar2_column = :varchar2_bv;

CHAR_COLUMN          VARCHAR2_COLUMN
-------------------- --------------------
hello world          hello world

SQL> 

测试:以下以CHAR类型来进行绑定变量操作

SQL> variable char_bv char(20)
SQL> exec :char_bv := 'hello world';

PL/SQL procedure successfully completed.

SQL> select * from t where char_column = :char_bv;

CHAR_COLUMN          VARCHAR2_COLUMN
-------------------- --------------------
hello world          hello world
这里列长度相等,绑定成功

SQL> select * from t where varchar2_column = :char_bv;

no rows selected

SQL> 

总结:能不使用CHAR就不使用CHAR,都用VARCHAR2来操作字符数据!


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15720542/viewspace-731471/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/15720542/viewspace-731471/

<think>我们正在讨论如何使用C/C++中的#define预处理指令来定义字符串常量。 根据引用[1]和引用[3]的内容,我们知道#define可以用来定义标识符常量(包括数值常量和字符串常量)。 定义字符串常量的基本语法是: #define 常量名 字符串 例如: #define GREETING "Hello, World!" 这样,在程序中所有出现GREETING的地方都会被替字符串"Hello, World!"。 注意:由于#define是预处理指令,它只是进行简单的文本替,因此不需要分号结尾(如果加了分号,则替时会包含分号,可能导致错误)。 另外,引用[2]中提到了使用#define来实现中文编程,我们可以将关键字或变量名定义为中文,但同样也可以定义中文字符串。 例如: #define 问候语 "你好,世界!" 这样,在程序中就可以使用“问候语”来代替这个字符串。 但是,需要注意的是,在C++中,使用中文变量名虽然可以通过编译,但并不是良好的编程实践,因为可能会带来可读性和可维护性的问题。不过,这里我们主要关注字符串常量的定义。 下面我们通过具体的代码示例来说明。</think>### 使用`#define`定义字符串常量的方法 在C/C++中,`#define`是预处理指令,用于定义宏常量(包括字符串常量)。其核心原理是**编译前的文本替**——编译器在预处理阶段将代码中的宏名直接替为对应的字符串文本。以下是具体方法和注意事项: --- #### 📌 基础语法 ```c #define 常量名 "字符串内容" ``` **示例**: ```c #include <stdio.h> #define GREETING "你好,世界!" // 定义中文字符串常量 #define WARNING "⚠️ 内存不足!" // 定义含特殊符号的字符串 int main() { printf("%s\n", GREETING); // 输出:你好,世界! printf("%s\n", WARNING); // 输出:⚠️ 内存不足! return 0; } ``` - **替原理**: 预处理时,`GREETING`会被直接替为`"你好,世界!"`,等同于`printf("%s\n", "你好,世界!")`[^1][^3]。 --- #### ⚠️ 关键注意事项 1. **无需分号结尾** `#define`不是语句,末尾**不能加分号**,否则分号会作为字符串的一部分: ```c #define ERROR_MSG "错误!" // ✅ 正确 #define ERROR_MSG "错误!"; // ❌ 错误!将导致 printf("%s", ERROR_MSG); 替为 printf("%s", "错误!";); ``` 2. **引号必须成对** 若字符串内需包含引号,需用转义符`\"`: ```c #define QUOTE "他说:\"学习C语言很重要\"" ``` 3. **支持中文和特殊符号** 如引用[2]所示,可通过宏实现中文编程: ```c #define 打印 printf #define 问候语 "你好,程序员!" int main() { 打印("%s", 问候语); // 输出:你好,程序员! } ``` 4. **与`const`常量的区别** - `#define`:预处理阶段替,**不占用内存**,无类型检查[^1][^4]。 - `const`:运行时生效,占用内存,有类型安全(如`const char* str = "常量";`)[^4]。 --- #### 🔧 实用技巧 1. **多行字符串定义** 使用反斜杠`\`连接多行: ```c #define LONG_TEXT "第一行文本\n" \ "第二行文本\n" \ "第三行文本" ``` 2. **拼接字符串** 利用相邻字符串自动拼接的特性: ```c #define NAME "Alice" #define MSG "用户 " NAME " 登录成功" // 替为:"用户 " "Alice" " 登录成功" → "用户 Alice 登录成功" ``` 3. **条件编译配合宏** 根据环境选择不同字符串: ```c #define DEBUG_MODE 1 #if DEBUG_MODE #define STATUS "调试模式" #else #define STATUS "生产模式" #endif ``` --- #### ❌ 常见错误示例 ```c // 错误1:分号导致语法错误 #define MSG "测试"; // 错误2:未转义内部引号 #define STR "This is "wrong""; // 应改为"This is \"wrong\"" // 错误3:宏名重复定义(可能覆盖之前定义) #define MSG "第一次定义" #define MSG "第二次定义" // 编译器警告 ``` > **总结**:`#define`定义字符串常量简洁高效,但需注意文本替的本质——无类型检查、无作用域限制。在需要类型安全或作用域控制的场景,优先选用`const`常量[^1][^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值