Oracle数据库字符集研究
Oracle服务器: select * from NLS_database_PARAMETERS where parameter like
Oracle服务器:
select * from NLS_database_PARAMETERS where parameter like '%CHARACTERSET%';
PARAMETER VALUE
------------------------------ ----------------------------------------
NLS_CHARACTERSET WE8MSWIN1252
NLS_NCHAR_CHARACTERSET AL16UTF16
表t1:
desc t1;
Name Null Type
---- ---- --------------
ID NUMBER
NAME NVARCHAR2(100)
SQL Developer 查询和insert中文
C:\sqldeveloper\sqldeveloper\bin\sqldeveloper.conf
AddVMOption -Doracle.jdbc.convertNcharLiterals=true
Preference -- > Environment, Encoding选择UTF-16
ALTER SESSION SET NLS_LANGUAGE='SIMPLIFIED CHINESE';
TRUNCATE TABLE T1;
INSERT INTO T1 VALUES(1,N'啊');
insert into t1 values(2, '啊');
COMMIT;
col name format a10;
select * from t1;
ID NAME
---------- ----------
1 啊
2 ¿
N'啊'表示nvarchar类型的数据。
以下内容未测试过:
JDBC的配置
-Doracle.jdbc.defaultNChar=true
-Doracle.jdbc.convertNcharLiterals=true
Linux下SQLPlus
NLS_LANG=AMERICAN_AMERICA.AL32UTF8
LC_CTYPE="zh_CN.utf8"
ORA_NCHAR_LITERAL_REPLACE=true
varchar2的长度
varchar2 类型的字段长度以字符或字节来计算,,如varchar2(10 byte), varchar2(10 char)。通常,byte/char都被省略,这时NLS_LENGTH_SEMANTICS定义了默认值。
show parameters NLS_LENGTH_SEMANTICS;
NAME TYPE VALUE
-------------------- ----------- ----
nls_length_semantics string BYTE
数据库的字符集
select * from nls_database_parameters where parameter like '%CHARACTER%'
PARAMETER VALUE
------------------------- -----------
NLS_NUMERIC_CHARACTERS .,
NLS_CHARACTERSET AL32UTF8
NLS_NCHAR_CHARACTERSET AL16UTF16
AL32UTF8编码的字符长度是可变的,1-4字节,ASCII字符是1字节。如下所示:
desc t2;
Name Null Type
----- ---- -----------
TNAME VARCHAR2(2)
select * from t2;
TNAME
-----
12
可以看出数字1和2各占一个字节。
查看某字符在当前字符集下的字节数
select lengthb ('C'), lengthb('啊'), length('\r') FROM DUAL;
LENGTHB('C') LENGTHB('啊') LENGTH('\R')
------------ ------------ ------------
1 3 2