我们知道在MS SQL中CHAR(N)或VARCHAR(N)的N是指Bytes,而不是字符的个数,那么在 oracle 中(CHAR或VARCHAR2),这个N到底是字符的个数还是字节长度?
在 oracle 中这个N既可以是Bytes也可以是Characters,那么如何去指定它是哪一种呢?有两种方法:
1.在CHAR或VARCHAR2中明确指定
如:CHAR(10 CHAR),VARCHAR2(20 CHAR),CHAR(10 BYTE),VARCHAR2(20 BYTE)
2.在初始化参数中指定
可以在初始化参数中指定NLS_LENGTH_SEMANTICS=’CHAR’或’BYTE’来确定
默认情况下这个参数是BYTE
那么这两种方式有什么关系和优缺点呢?
1.如果在CHAR或VARCHAR2中强制指定,那么会覆盖在初始化参数中的设定;
2.基于性能方面的考虑, oracle 推荐在初始化参数中进行设定;
3.单字节的字符在这两种设定中基本相同;
4.CHAR模式比较适合存储多字节的字符,比如中文,可降低长度设定的复杂度;
那么如果是CHAR模式, oracle 是如何计算需要多少字节来存储呢?
我们知道需要多少字节来存储一个字符跟字符集的设定有关系,拿UTF8为例,如果你要存储5个中文和5个英文,那么需要的字节长度是:
5*3 + 1*5 = 20bytes
因为在UTF8下存储一个中文字符需要3个字节,一个英文字符需要1个字节,所以总共是20bytes。那么在这种情况下,BYTE和CHAR模式该如何指定呢?
BYTE: CHAR(20)或VARCHAR2(20)
CHAR: CHAR(10)或VARCHAR2(10)
有此可以看出对于多字节的字符用CHAR模式比较方便,因为不需要去计算到底需要多少字节去存储。
No Comments
Be the first to comment on this entry.
Leave a comment
Fields in bold are required. Email addresses are never published or distributed.
Some HTML code is allowed:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>URLs must be fully qualified (eg: http://www.dbifan.com),and all tags must be properly closed.
Line breaks and paragraphs are automatically converted.
Please keep comments relevant. Off-topic, offensive or inappropriate comments may be edited or removed.