6.1 Data Type

查看数据所占空间的两个函数:

-- 查看所占字节数
select length('你好,世界') from dual;
-- 查看所占字符数,即多少个字母,多少个汉字
select lengthb('您好,美女') from dual; -- 比如
create table aaa (a varchar2(6));
insert into aaa values ('aaa');
insert into aaa values ('你好');
select a, length(a), lengthb(a) from aaa;

6.1.1 字符类型

  • char,固定长度,默认1,最大2000,如果长度不够,用空格填充。
  • varchar2 类型,变长字符串,最多4000字节长度。
  • nvarchar2,跟上面比,增加了字符集的支持。
  • long,用于存储大数据,最多 2G。不建议使用,已被 clob 类型替代。
    -- 它的使用跟 SQL 的标准 varchar 基本类似,
    -- 但是,在 Oracle 中请使用 varchar2 而不是 varchar,
    -- varchar2 的效率更高,并且在兼容性上做的更好
    -- 初始化的语句为: name varchar2(20)
    -- 其中 20 代表最大长度, 默认单位是字节。
    -- 如果定义为: name varchar2(20 char),表示最大保存20个字符长度的字符串。
    create table aaa (
    a varchar2(20), -- 最大是20个字节长度,默认单位字节
    b varchar2(20 byte), -- 最大为20个字节长度,跟上面是一样的
    c varchar2(20 char) -- 最大为20个字符长度
    ); -- varchar2 最大能保存 4000 个字节
    -- 如果是英文,则是 4000 个英文字母
    -- 如果是中文,需要按照字符集判断:
    -- GBK 用两个字节表示一个汉字,所以 varchar2 最多表示 2000 个汉字
    -- UTF-8 是变长字符集,用一个字节表示一个英文字母,用3个或4个字节表示一个汉字,所以,最多可以保持1333个汉字。
    select length('你好') from dual; -- 2
    select lengthb('你好') from dual; -- 4 -- char 类型是固定长度的,可能会占用更多空间。但是因为长度固定,块的分配管理比较块,效率很高。
    -- varchar2 是变长的,会占用尽量少的空间。但是需要消耗更多资源为分配变长空间,效率略低。
    -- 所以,用哪一种,酌情而定。 -- nchar/nvarchar2 是 char/varchar2 的字符集支持版本,对多字节字符有算法上的优化。
    -- 感觉用的比较少。

6.1.2 数值类型

  • number,占用 38 位,有自己的内部表示方式,可以表示天文数字。
  • int/float,number 类型的子类型
    -- number 类型的语法为 NUMBER [位数[,小数点数]]
    create table bbb (
    a number, -- 一共 38 位,其他按照插入的值自动判断
    b number(5), -- 一共5位
    c number(5, 2), -- 一共5位,3位整数,2位小数
    d number (*, 2) -- 保存两位小数,其他随意
    e number (*, 0), -- 相当于 int
    f int
    ); -- 插入的时候,多余的小数会被切掉,但如果整数位超了,会报错
    insert into bbb values (111.223, 111.223, 111.223, 111.223, 22); -- 一般情况下,作为表的主键,设为 int 类型就可以了

6.1.3 日期类型

  • date,存储的年月日,时分秒
  • timestamp,存储的更详细,包括时区,还有精确到小数点后6位的秒数等
  • timestamp with time zone,可以设置时区
  • sysdate/systimestamp 连个函数用来查询当前的日期
    -- 显示当前时间
    select sysdate from dual;
    select systimestamp from dual; -- 时间的显示格式,由 nls_date/time_format 等参数控制
    show parameter nls
    -- 如果想格式化时间,可以有下面方法:
    -- 1. 更改注册表中变量
    -- # set NLS_DATE_FORMAT='yyyy.mm.dd'
    -- 2. 更改当前会话中的格式
    alter session set NLS_DATE_FORMAT='yyyy.mm.dd';
    -- 3. 手动转型:to_char
    -------- yyyy 代表四位的年, rr 代表两位的年
    -------- mm 代表两位的数字月,
    -------- dd 代表两位的数字日,
    -------- hh 代表12格式的小时, hh24 代表24格式的小时
    -------- mi 代表分钟数
    -------- ss 代表秒数
    select to_char(sysdate, 'yyyy-mm-dd') from dual; -- date 比 timestamp 占用更少空间
    -- timestamp 比 date 更精确
    -- 没有优劣,使用哪一个,按照需求来 -- 插入时间,使用 to_date 转型。
    -- 符合标准日期格式的字符串,可以隐式转型。
    create table stu (name varchar2(20), birth date default sysdate);
    insert into stu values ('aaa', sysdate); -- 当前时间
    insert into stu values ('bbb', '20100303'); -- 插入成功,char 自动转型为 date
    insert into stu values ('ccc', to_date('1999-01-11', 'yyyy-mm-dd'); -- 手动转型

6.1.4 二进制类型

  • RAW
  • LONG RAW

6.1.5 LOB 类型

Large Object,用来存储大数据。

Oracle 提供了 DBMS_LOG 包对 LOB 类型的数据进行处理。 也可以在 jdbc 中通过 getXLob() 的方式进行 lob 字段的处理。

  • CLOB,charactor,存储大容量字符串
  • BLOB,Binary,存储二进制文件,如小图片、小电影
  • BFile/XMLType 等
    create table article
    (
    id int primary key,
    title varchar2(20) not null,
    content clob,
    createtime date default sysdate
    );
    insert into article (id, title, content) values (1, 'Oracle 使用指南', '你好');

6.1.6 伪列(Pseudo Column)

 
  1. rowid

    rowid 是 oracle 中的伪列。可以通过下面语句显示:

    select d.rowid, d.* from dept d
    

    它是唯一的,不可变的,固定长度的。

    它是数据存储物理地址的一种映射。一共有18位,前6位表示对象id,后3位表示fno,后6位表示块编号,最后3位表示行编号。 所以,通过rowid可以最快速度地定位到数据所在的位置。

    比如,如果某行数据的 rowid 是 AAAO0fAAFAAAAlmAAA, 那么可以根据它直接定位数据的物理地址:

    AAAO0f AAF AAAAlm AAA
    对象号(6个字符) 文件号(3个字符) 块号(6个字符) 行号(3个字符)

    rowid 是 oracle 特有的。

    不建议使用 rowid 作为表的主键。迁移的需求,有改变的风险。

  2. rownum

    列出每一行数据的行数,从1开始,自然增长。

    -- 基本用法
    select rownum, d.* from dept;
    select rownum, d.* from dept d where rownum < 3; -- 显示前两条
    select * from (select rownum rn, d.* from dept d) t where t.rn = 3; -- 只显示第三条
    select * from (select * from emp order by sal desc) where rownum<=3; -- 显示 emp 表中工资前三位的雇员信息。

6.1.7 NULL

它是 Oracle 中非常特殊的一种类型。它表示不确定,表示没有值。并且它能转化成所有的类型。 向数据库中插入空字符串时,oracle 会把它自动转化为 null 类型。所以,在查询空字符的时候:

select * from n3 where s = '';

上面的语句是非法,不合适的。应该这样查:

select * from n3 where s is null;
select * from n3 where s is not null;

创建表的时候,为了约束插入的数据不能为空,应该在字段的后面写上 not null 约束。

create table n5 (s varchar2(20) not null);

跟 null 做任何的运算,结果仍然是 null.

select null + '' from dual;   -- null

SQL语句 数据类型的更多相关文章

  1. SQL语句查询某表的所有字段及数据类型

    SQL语句查询某表的所有字段及数据类型 SELECT name AS column_name , TYPE_NAME(system_type_id) AS column_type , max_leng ...

  2. 数据库入门-基本sql语句及数据类型

    一.基本sql语句 SQL语言主要用于存取数据.查询数据.更新数据和管理关系数据库系统,SQL语言由IBM开发.SQL语言分为3种类型: #.DDL语句 数据库定义语言: 数据库.表.视图.索引.存储 ...

  3. SQLServer中查询表结构(表主键 、列说明、列数据类型、所有表名)的Sql语句

    SQLServer中查询表结构(表主键 .列说明.列数据类型.所有表名)的Sql语句 1.查询数据库中的所有表名称: SELECT name FROM SysObjects Where XType=' ...

  4. 五:SQL语句中的数据类型

    一:MySQL数据类型 MySQL中定义数据字段的类型对你数据库的优化是非常重要的 MySQL支持多种数据类型,大致可以分为三类:数值 日期/时间和字符串 二.数值类型(12) 2.1.整数类型(6) ...

  5. MySQL数据库:SQL语句基础、库操作、表操作、数据类型、约束条件、表之间的关系

    数据库相关概念: 1. 数据库服务器:运行数据库管理软件的计算机 2. 数据库管理软件:MySQL.Oracle.db2.slqserver 3. 库:文件夹,用来组织文件/表 4. 表:文件(类似于 ...

  6. Mybatis中动态SQL语句中的parameterType不同数据类型的用法

    Mybatis中动态SQL语句中的parameterType不同数据类型的用法1. 简单数据类型,    此时#{id,jdbcType=INTEGER}中id可以取任意名字如#{a,jdbcType ...

  7. 数据库学习之二--SQL语句以及数据类型

    一.SQL语句种类: 1. DDL(Data Definition Language,数据定义语言)用来创建或者删除存储数据用的数据库以及数据库中的表;包含以下几种指令: a. CREATE:CREA ...

  8. 二 sql语句,常用字段数据类型

    MySQL中常用DDL命令   database definition language  与 DML命令 :  database definition language 操作数据库: 创建数据库 : ...

  9. 【MySQL】MySQL基础(SQL语句、约束、数据类型)

    数据库的基本概念 什么是数据库? 用于存储和管理数据的仓库 英文单词为:DataBase,简称DB 数据库的好处? 可以持久化存储数据 方便存储和管理数据 使用了统一的方式操作数据库 -- SQL 常 ...

随机推荐

  1. 四十九:数据库之Flask-SQLAlchemy下alembic的配置

    准备工作 配置数据 创建迁移文件并映射到数据库 增加字段 删除字段

  2. 学习Go语言(二)快速入门

    作为一名学习过多种编程语言的“老码农”,学习一门新的语言不能像“新手”一样,要快速入门. 无论面向过程,还是面向对象的编程语言:静态语言,动态语言,一般都包括: 标识符.变量(常量).运算符.表达式. ...

  3. 【Qt开发】QTableWidget设置根据内容调整列宽和行高

    QTableWidget要调整表格行宽主要涉及以下一个函数 1.resizeColumnsToContents();                      根据内容调整列宽            ...

  4. 导入已有项目到svn

    版本管理一直是程序员使用频率比较高的一个工具软件.不管你是自己使用还是使用别人提供的svn服务,svn的使用技巧都一个必须掌握的技术.为止小编专门制作了关于svn使用技巧的系列文章.今天我们先来介绍一 ...

  5. HDU 1171 Big Event in HDU (动态规划、01背包)

    Big Event in HDU Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  6. 通过U盘或CD/DVD装centos7,出现“dracut-initqueue timeout..."解决办法

    1.在用CD/DVD挂载centos7镜像安装系统时,出现“dracut-initqueue timeout...", :/# cd dev :/# ls 2.这是因为安装程序未能找到安装文 ...

  7. String.equals()方法、整理String类的Length()、charAt()、 getChars()、replace()、 toUpperCase()、 toLowerCase()、trim()、toCharArray()

    equals 是比较的两个字符串是否一样 length() 返回字符串的长度 charAt (int index) 返回index所指定的字符 getChars(int srcBegin,int sr ...

  8. numpy中的快速的元素级数组函数

    numpy中的快速的元素级数组函数 一元(unary)ufunc 对于数组中的每一个元素,都将元素代入函数,将得到的结果放回到原来的位置 >>> import numpy as np ...

  9. SPOJ 4003 Phone List 题解

    题面 啊~,很水的一道trie树模板题: 当两个串存在关系时情况有两种: 若当前串插入后没有任何新建节点,则该串肯定是之前插入的某个串的前缀: 若在插入的时候,有某个经过的节点带有某串结尾的标记,则之 ...

  10. 通过sohu获取浏览器端IP地址

    接口:http://pv.sohu.com/cityjson?ie=utf-8