Oracle 中有4 种基本的字符串类型,分别是CHAR、VARCHAR2、NCHAR 和NVARCHAR2。
在Oracle 中,所有串都以同样的格式存储。在数据库块上,最全面都有一个1~3 字节的长度字段,其后是数据。
1) CHAR(<SIZE><BYTE|CHAR>):定长字符串,会用空格填充来达到其最大长度。最多可以存储2,000字节的信息。
2) NCHAR(<SIZE>):包含UNICODE格式数据的定长字符串。最多可以存储2,000字节的信息。
3) VARCHAR2<SIZE><BYTE|CHAR>:VARCHAR 的同义词。变长字符串,不会用空格填充至最大长度。最多可以存储4,000 字节的信息。
4) NVARCHAR2(<SIZE>):包含UNICODE 格式数据的变长字符串。最多可以存储4,000 字节的信息。
VARCHAR2和CHAR类型支持两种指定长度的方法:
1) 用字节指定,例如VARCHAR2(10 BYTE),支持最多10字节的数据。
2) 用字符指定,例如VARCHAR2(10 CHAR)。这将支持最多10字符的数据,但是最大程度仍然是4000字节,所以即使指定VARCHAR2(4000 CHAR),可能并不能放下4000个字符。
VARCHAR2和CHAR类型存储的字符串按照数据库字符集编码。
可以通过NLS_CHARACTERSET参数察看当前的数据库字符集。
所以如果数据库字符集使用多字节字符集,例如UTF8,那么应该使用CHAR来指定长度。
如果不指定BYTE|CHAR,默认是BYTE。可以使用参数NLS_LENGTH_SEMANTICS在会话或系统级别来修改默认行为。
NVARCHAR2和NCHAR总是使用字符数来指定长度。
NVARCHAR2和NCHAR类型存储的字符串可以使用UTF8 or AL16UTF16作为字符集,默认为AL16UTF16。
可以通过NLS_NCHAR_CHARACTERSET参数来查看当前的NCHAR字符集。
字符串的存储和NLS关系密切,NLS(National Language Support)->http://blog.youkuaiyun.com/fw0124/article/details/6655381
查看数据库字符集和NCHAR字符集的方法:select * from v$nls_parameters;
CHAR/NCHAR 实际上只是伪装的VARCHAR2/NVARCHAR2,其实只需要考虑两种字符串类型:VARCHAR和NVARCHAR2。CHAR类型总是会用空格填充得到的串,使之达到一个固定宽度,这会导致占用更多的存储空间。
另外,如果使用CHAR/NCHAR 类型,在执行字符串比较的时候,特别是使用绑定变量的时候,会遇到问题,例如:
以上执行select * from t where char_col = 'hello';的时候,实际上发生了隐式转换,’hello’已经提升为一个CHAR(20),并在其中填充了空格。
但是使用绑定变量的时候,不会发生隐式转换,所以查询会失败。
因此,一般来讲,应该总是使用变长字符串。
二进制串类型
RAW(<size>):RAW类型是变长二进制数据类型,采用这种数据类型存储的数据不会发生字符集转换。最多可以存储2,000 字节的信息。
诸如SQL*Plus之类工具处理RAW数据时,会把它被隐式地转换为一个VARCHAR2类型。例如:
tony@MYTEST2> select sys_guid() from dual;
SYS_GUID()
--------------------------------
8CB01E29329F4F35B9CE989AE0E64233
推荐使用显示转换,可以使用以下内置函数:
1)HEXTORAW:将十六进制字符串转换为RAW类型
2)RAWTOHEX:将RAW串转换为十六进制串
LONG类型
1) LONG:能存储最多2G字节的字符数据。与VARCHAR2或CHAR 类型一样,存储在LONG类型中的文本要进行字符集转换。
2) LONG RAW:能存储多达2GB的二进制信息。
LONG类型有许多限制,提供LONG类型只是为了保证向后兼容性。
不要使用LONG类型,使用CLOB/NCLOB类型;不要使用LONG RAW类型,使用BLOB类型。