1. 计算字符长度 'length()'
计算字节长度 'lengthb()'
2. 不同的 '编码方式','字节' 长度也不一样,一般来说
GBK :一个汉字 = 2 个字节,1个英文 = 1 个字节
UTF-8:一个汉字 = 3 个字节,1个英文 = 1 个字节
3. 字符集查询
select *
from nls_database_parameters t
where t.parameter in ('NLS_CHARACTERSET', -- 数据库字符集
'NLS_NCHAR_CHARACTERSET' -- 国家字符集
);
4. 验证数据类型:dump() 函数,上述不用记,在数据库上验证下就知道了。
chr(97) = 'a' -- ascii 码对应的字符
ascii('a') = 97 -- 字符对应的 ascii 码
扩展:Oracle dump() 详解
基础数据准备:
create table char_type_test (
t_char char(10),
t_nchar nchar(10),
t_varchar2 varchar2(10),
t_nvarchar2 nvarchar2(10),
t_varchar varchar(10)
);
insert into char_type_test
(t_char, t_nchar, t_varchar2, t_nvarchar2)
values
('ab悠悠', 'ab悠悠', 'ab悠悠', 'ab悠悠');
commit;
验证:char、nchar
select t.t_char, dump(t.t_char, 1010), length(t.t_char) 字符长度, lengthb(t.t_char) 字节长度
from char_type_test t;
select t.t_nchar, dump(t.t_nchar, 1010), length(t.t_nchar) 字符长度, lengthb(t.t_nchar) 字节长度
from char_type_test t;
查询结果:
同理,验证 varchar2 和 nvarchar2:
验证: varchar 在 11g 版本会强制性转化为 varchar2
select *
from user_tab_columns t
where t.table_name = 'CHAR_TYPE_TEST'
order by t.column_id;
-- ALTER TABLE char_type_test MODIFY t_varchar VARCHAR(10);
-- 即便你声明或修改为 varchar 类型
-- Oracle 在 11g 版本及以后都强制性转为 varchar2 了
create table number_type_test (
n1 number,
n2 number(2, 1),
n3 number(2, 4),
n4 number(2, -3)
);
-- 测试数据(知晓即可,日常开发,没人这么干,自己给自己挖坑)
insert into number_type_test(n2) values(1.45); -- 1.5
insert into number_type_test(n2) values(11.0); -- error p=3,s=1
insert into number_type_test(n3) values(0.00999); -- error p=3,s=5
insert into number_type_test(n4) values(11500.5); -- 12000 (有效为 = p + |s|,没有小数位,小数点往左数 s 位,四舍五入)
create table date_type_test (
create_date date,
update_date timestamp
);
insert into date_type_test values(sysdate, sysdate);
1. 查询表字段的数据类型
select *
from dba_tab_columns t
where t.owner = 'SCOTT'
and t.table_name like '%TEST%'
order by t.table_name, t.column_id;