今天难得有点小时间实际操作了一下关于oracle数据库中的字符集和排序相关的命令特此整理出来以备后用
Java代码
SQL> select * from v$nls_valid_values where parameter=CHARACTERSET order by ;
PARAMETER VALUE
CHARACTERSET ALUTF
CHARACTERSET ALUTFFSS
CHARACTERSET ALUTF
SQL> select * from nls_database_parameters;
PARAMETER VALUE
NLS_LANGUAGE AMERICAN合法的语言名称
NLS_TERRITORY AMERICA合法的地域名称
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS
NLS_CHARACTERSET ZHSGBK数据库字符集
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DDMONRR日期格式
NLS_DATE_LANGUAGE AMERICAN
NLS_SORT BINARY排序方式
NLS_TIME_FORMAT HHMISSXFF AM
NLS_TIMESTAMP_FORMAT DDMONRR HHMISSXFF AM
NLS_TIME_TZ_FORMAT HHMISSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT DDMONRR HHMISSXFF AM TZR
NLS_DUAL_CURRENCY $
NLS_COMP BINARY和排序相关的东东具体是什么不清楚
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
NLS_NCHAR_CHARACTERSET ALUTF国家字符集
NLS_RDBMS_VERSION
已选择行
已用时间: : :
SQL> create table char_t(c varchar()c nvarchar());
表已创建
已用时间: : :
SQL> select dbms_metadataget_ddl(TABLECHAR_T) FROM DUAL;
DBMS_METADATAGET_DDL(TABLECHAR_T)
CREATE TABLE SCOTTCHAR_T
( C VARCHAR()
C NVARCHAR()
) PCTFREE PCTUSED INITRANS MAXTRANS NOCOMPRESS LOGGING
STORAGE(INITIAL NEXT MINEXTENTS MAXEXTENTS
PCTINCREASE FREELISTS FREELIST GROUPS BUFFER_POOL DEFAULT)
TABLESPACE USERS
已用时间: : :
SQL> INSERT INTO char_t values(aa);
已创建 行
已用时间: : :
SQL> commit;
提交完成
已用时间: : :
SQL> select length(c)length(c)lengthb(c)lengthb(c) from char_t;
LENGTH(C) LENGTH(C) LENGTHB(C) LENGTHB(C)
已用时间: : :
SQL> insert into char_t values(中中);
已创建 行
已用时间: : :
SQL> select length(c)length(c)lengthb(c)lengthb(c) from char_t;
LENGTH(C) LENGTH(C) LENGTHB(C) LENGTHB(C)
已用时间: : :
SQL> insert into char_t values(遽遽);
已创建 行
已用时间: : :
SQL> select length(c)length(c)lengthb(c)lengthb(c) from char_t;
LENGTH(C) LENGTH(C) LENGTHB(C) LENGTHB(C)
已用时间: : :
至于一个VARCHAR字符要用几个字节存储要看数据库使用的字符集
比如GBK汉字就会占两个字节英文个如果是UTF汉字一般占个字节英文还是个
而NCHARNVARCHAR是以UNICODE存储每个字符固定两个字节
SQL> select hiredate from emp;
HIREDATE
DEC
FEB
FEB
APR
SEP
SQL> show user;
USER is SCOTT
SQL> alter session set nls_language=simplified chinese
会话已更改
已用时间: : :
SQL> select hiredate from emp;
HIREDATE
月
月
月
月
已用时间: : :
查看session中支持的语言名称
* select * from v$nls_valid_values where parameter=LANGUAGE order by
QL> /
ARAMETER VALUE
ANGUAGE AMERICAN
ANGUAGE ARABIC
ANGUAGE ASSAMESE
ANGUAGE AZERBAIJANI
ANGUAGE BANGLA
ANGUAGE BENGALI
ANGUAGE BRAZILIAN PORTUGUESE
查看合法的地域名称
SQL> select * from v$nls_valid_values where parameter=TERRITORY order by ;
PARAMETER VALUE
TERRITORY ALGERIA
TERRITORY AMERICA
TERRITORY AUSTRIA
TERRITORY AZERBAIJAN
TERRITORY CANADA
TERRITORY CATALONIA
TERRITORY CHILE
TERRITORY CHINA
查看合法的排行名称
SQL> select * from v$nls_valid_values where parameter=SORT order by ;
PARAMETER VALUE
SORT SCHINESE_PINYIN_M
SORT SCHINESE_RADICAL_M
SORT SCHINESE_STROKE_M
查看当前会话的排行模式(系统默认的排行方式是BINARY)
SQL> select value from nls_session_parameters where parameter=NLS_SORT;
VALUE
BINARY
修改排行方式的测试
SQL> alter session set nls_sort=SCHINESE_PINYIN_M;
会话已更改
已用时间: : :
SQL> select * from sort_tab order by ;
C
啊
藏这个是个多音字在此处oracle把他当cang了
木
目
人
三
一
已选择行
已用时间: : :
SQL> alter session set NLS_SORT=SCHINESE_STROKE_M;按照笔划(第一顺序)部首(第二顺序)排序
会话已更改
已用时间: : :
SQL> select * from sort_tab order by ;
C
一
人
三
木
目
啊
藏
已选择行
已用时间: : :
SQL> alter session set NLS_SORT=GBK;
会话已更改
已用时间: : :
SQL> select * from sort_tab order by ;
C
啊
藏
木
目
人
三
一
已选择行
已用时间: : :
SQL> alter session set NLS_SORT=SCHINESE_RADICAL_M;按照部首(第一顺序)笔划(第二顺序)排序
会话已更改
已用时间: : :
SQL> select * from sort_tab order by ;
C
一
三
人
啊
木
目
藏
已选择行
已用时间: : :
SQL> ALTER SESSION SET NLS_SORT=BINARY;按字符的二进制值比较
会话已更改
已用时间: : :
SQL> select * from sort_tab order by ;
C
啊
藏
木
目
人
三
一
已选择行
已用时间: : :
注意如果NLS_SORT不是设置为Binary那么就会引起全表扫描
是不会使用索引的在我们的系统中变更单涉及到的数据都是数据庞大的表
如果不使用到索引查询的效率不受到影响才怪呢!
修改数据库字符集
alter database orcl character set ZHSCGB;
修改国家语言字符集
alter database orcl national character set ZHSCGB;