22.1
问题描述
22.2
解决方案
在oracle中一个字符特别是中文占几个字节是不同的。
比如我创立一个表create
table
test_ly(a
varchar2(4),b
nvarchar2(4))
错!最多能插入一个汉字加一个字母(或数字)。
错!b列最多能插入4个汉字,b列的一个汉字或者其他字符(比如数字或者字母或者英文标点符号)占2个字节。
由此可见,N开头的字段类型(比如NCHAR,NVARCHAR2)中,任何一个字符(包括一个汉字)占2个字节,统一的。
不以N开头的字段类型(比如CHAR,VARCHAR2)中,unicode字符(比如汉字)占3个字节,其他字符占1个字节。
Length
函数求得是占用字符数,lengthb或者vsize函数求得是占用字节数。
你说
中华12
这个字符串占用了多少字符,字节?看sql返回值便清楚了。
select
length('中华12')
from
dual
--返回4,也就是占用4个字符
select
lengthb('中华12')
from
dual
--返回8,也就是占用8个字节,其中中华儿子各占3个字节,而12两个字符各占一个字节
select
lengthb(N'中华1')
from
dual
--返回6,这是将字符串转换成为unicode字符串后,每个字符占用2个字节,3个就是6个字节
select
length(N'中华1')
from
dual
--返回3,因为只有3个字符嘛。
字符串类型字段默认的长度是以字节为单位的,具体取决于参数nls_length_semantics
的值(使用show
parameters可以看到这个参数的值),默认是BYTE,也就是以字节为单位的,如果是CHAR则是以字符为单位的。表的某列可以使用字符为单位吗?当然可以,比如这样创建即可:create
table
test_ly(a
varchar2(4
char))
这样a列就最多能保存4个字符,而不是4个字节了。
英文
一般都是一个字符
对应一个字节
中文的话
在不同字符集下会略有区别,一般是一个字符
2~3字节