1:char 和 varchar2的区别:
varchar2 :variable-length 变长
char : fixed-length 固定长度
char定义的时候分配内存,而varchar2动态分配内存
下面一个例子明确的说明了这两个的区别 :
SQL> DECLARE
2 c CHAR(32767) := ' ';
3 v VARCHAR2(32767) := ' ';
4 BEGIN
5 dbms_output.put_line('c is ['||LENGTH(c)||']');
6 dbms_output.put_line('v is ['||LENGTH(v)||']');
7 v := v || ' ';
8 dbms_output.put_line('v is ['||LENGTH(v)||']'); END;
9 /
c is [32767]
v is [1]
v is [2]
PL/SQL 过程已成功完成。
输出的结果显示:CHAR类型变量在定义的时候分配内存,分配的内存也可能超过变量定义的大小,VARCHAR2类型变量动态分配内存,根据设置的变量的大小。
下面的例子也说明这一点:
SQL> DECLARE
2 c CHAR(32767) := ' ';
3 v VARCHAR2(32767) := ' ';
4 var1 CHAR := ' '; -- Implicitly sized at 1 byte.
5 var2 CHAR(1) := ' '; -- Explicitly sized at 1 byte.
6 var3 CHAR(1 BYTE) := ' '; -- Explicitly sized at 1 byte.
7 var4 CHAR(1 CHAR) := ' '; -- Explicitly sized at 1 character.
8 BEGIN
9 dbms_output.put_line('c is ['||LENGTH(c)||']');
10 dbms_output.put_line('v is ['||LENGTH(v)||']');
11 dbms_output.put_line('var1 is ['||LENGTH(var1)||']');
12 dbms_output.put_line('var2 is ['||LENGTH(var2)||']');
13 dbms_output.put_line('var3 is ['||LENGTH(var3)||']');
14 dbms_output.put_line('var4 is ['||LENGTH(var4)||']');
15 v := v || ' ';
16 dbms_output.put_line('v is ['||LENGTH(v)||']'); END;
17 /
c is [32767]
v is [1]
var1 is [1]
var2 is [1]
var3 is [1]
var4 is [1]
v is [2]
2:character 和 char的区别:
CHARACTER类型是CHAR的subtype,CHARACTER类型和它的基类优相同的大小,在CHAR和CHARACTER数据类型之间隐式转换。以下是一个subtype的定义:
SUBTYPE subtype_name IS base_type[(maximum_size [BYTE | CHAR])] [NOT NULL];
SQL> DECLARE
2 SUBTYPE code IS CHAR(1 CHAR);
3 c CHAR(1 CHAR) := 'A';
4 d CODE;
5 BEGIN
6 d := c;
7 END;
8 /
PL/SQL 过程已成功完成。
3: TIMESTAMP 和DATE的区别:
TIMESTAMP是DATE的subtype,提供更精确的时间。
以下这个例子说明了它们之间的区别:
SQL> DECLARE
2 d DATE := SYSTIMESTAMP;
3 t TIMESTAMP(8) := SYSTIMESTAMP;
4 BEGIN
5 dbms_output.put_line('DATE ['||d||']');
6 dbms_output.put_line('TO_CHAR ['||TO_CHAR(d,'DD-MON-YY HH24:MI:SS')||']
');
7 dbms_output.put_line('TIMESTAMP ['||t||']');
8 END;
9 /
DATE [12-6月 -12]
TO_CHAR [12-6月 -12 17:50:17]
TIMESTAMP [12-6月 -12 05.50.17.40600000 下午]
PL/SQL 过程已成功完成。
注意: TIMESTAMP(8)代表精确度,你可以通过修改这个值看输出结果
时间区没有用到,不知道有什么作用,以下是改写的例子:
PL/SQL programing上这样说的:
The difference between these timestamps is that those with time zones append the time zone
to the timestamp. The time zone qualifier returns the standard time and an indicator whether the
time zone is using daylight saving time. The local time zone qualifier returns the difference
between the local time and Greenwich Mean Time (GMT)
SQL> DECLARE
2 var1 TIMESTAMP WITH LOCAL TIME ZONE;
3 var2 TIMESTAMP WITH LOCAL TIME ZONE := SYSTIMESTAMP;
4 var3 TIMESTAMP(3) WITH LOCAL TIME ZONE;
5 var4 TIMESTAMP(3) WITH LOCAL TIME ZONE := SYSTIMESTAMP;
6 BEGIN
7 dbms_output.put_line('var1 ['||var1||']');
8 dbms_output.put_line('var2 ['||var2||']');
9 dbms_output.put_line('var3 ['||var3||']');
10 dbms_output.put_line('var4 ['||var4||']');
11 END;
12 /
var1 []
var2 [12-6月 -12 05.51.44.750000 下午]
var3 []
var4 [12-6月 -12 05.51.44.750 下午]
PL/SQL 过程已成功完成。
一种有效的方式使用TRUNC(date_variable)函数把系统时间戳
SQL> DECLARE
2 d DATE := SYSDATE;
3 BEGIN
4 dbms_output.put_line(TO_CHAR( TRUNC(d) ,'DD-MON-YY HH24:MI:SS'));
5 END;
6 /
12-6月 -12 00:00:00
PL/SQL 过程已成功完成。
4:NCHAR 和 CHAR NVARCHAR 和 VARCHAR区别:
NCHAR数据类型采用统一字符编码相当于CHAR数据类型,NVARCHAR2数据类型是统一字符编码相当于VARCHAR2数据类型,我们应该使用NCHAR或者NVARCHAR,因为在同样的数据库中将支持多个字符集编码。
使用字符编码能够支持多个字符集,
AL16UTF16中一个字符占用3个字节 ,
UTF8 编码一个字符占用两个字节。
NCHAR 和 NVARCHAR是为了统一化字符编码,为以后的扩展用。
5:STRING,VARCHAR,VARCAHR2之间的关系;
STRING,和VARCHAR 是VARCAHR2的 subtype。
6:PLS_INTEGER 和 INTEGER的区别:
PLS_INTEGER使用操作系统的数学函数库,INTEGER是NUMBER的subtype。
PLS_INTEGER使用本地数学函数库,声明语句后不分配内存,直到变量分配一个值,可以通过length()函数进行侧测试;
SQL> DECLARE
2 var1 PLS_INTEGER; -- A null value requires no space.
3 var2 PLS_INTEGER := 11; -- An integer requires space for each character.
4 BEGIN
5 dbms_output.put_line('var1 ['||length(var1)||']');
6 dbms_output.put_line('var2 ['||length(var2)||']');
7 END;
8 /
var1 []
var2 [2]
PL/SQL 过程已成功完成。