自动类型转换(参照剑破冰山第6章学习总结)

本文探讨了Oracle数据库中不同类型的数据如何进行比较和转换,包括VARCHAR2与CHAR的区别,VARCHAR2的最大长度限制,并通过示例展示了这些类型的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下面的t表的 id 列是 VARCHAR2类型,执行计划中列X自动通过TO_NUMBER函数转换为数值类型。
也就是说,当比较字段与数值的时候,数值会有优先级。
SQL> select * from t where id=1;


ID
------------------------------
1




执行计划
----------------------------------------------------------
Plan hash value: 1601196873


--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |    17 |     3   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| T    |     1 |    17 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------


Predicate Information (identified by operation id):
---------------------------------------------------


   1 - filter(TO_NUMBER("ID")=1)


Note
-----
   - dynamic sampling used for this statement (level=2)




统计信息
----------------------------------------------------------
          5  recursive calls
          0  db block gets
         16  consistent gets
          0  physical reads
          0  redo size
        520  bytes sent via SQL*Net to client
        520  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

当字符串和DATE类型比较时,DATE类型具有较高优先级。
呵呵 偷懒一下。




CHAR 遇到VARCHAR2 要转为VARCHAR2。
固定长度 (char) 或可变长度 (varchar) 字符数据类型。

declare
  v_c  char(4) := 'ab  ';
  v_c2 varchar2(4) := 'ab';
begin
  if v_c = v_c2 then
    dbms_output.put_line('v_c=v_c2');
  else
    dbms_output.put_line('v_c<>v_c2');
  end if;
end;

结果:v_c<>v_c2  ----?????

SQL中VARCHAR2最大4000字节
PL/SQL中最大字节32767字节
测试:
declare
  v_str varchar2(32767);
begin
  v_str := lpad('a', '6000', 'a');
  dbms_output.put_line(length(v_str));
  v_str := lpad('b', '32767', 'b');
  dbms_output.put_line(length(v_str));
  v_str := lpad('c', '32768', 'c');
  dbms_output.put_line(length(v_str));
end;





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值