数据库的 2个参数 NLS_LENGTH_SEMANTICS 说明,comment 说明
###############
sample 1:NLS_LENGTH_SEMANTICS
1、數(shù)據(jù)庫字符集選擇的是NLS_CHARACTERSET=UTF8,如果NLS_CHARACTERSET=ZHS16GBK就不會有這種情況;
2、原庫中NLS_LENGTH_SEMANTICS=CHAR,新庫中NLS_LENGTH_SEMANTICS=BYTE;
3、主要是第2條造成的,如果字符集是UTF8,字段類型VARCHAR2中一個字符占幾個字節(jié)是由NLS_LENGTH_SEMANTICS參數(shù)決定的,
如果是BYTE,則一個字符占一個字節(jié),如果是CHAR,則一個字符占四個字節(jié)。
通過下面的語句可以查看實際的data_length長度
select table_name, column_name, data_type, data_length from cols
https://www.2cto.com/database/201502/376311.html
上面郵件,出于對隱私的保護(hù),對發(fā)件人,收件人,數(shù)據(jù)庫名稱進(jìn)行了隱涂。
郵件內(nèi)容主要意思是:
(1) 源端和目標(biāo)端數(shù)據(jù)庫的字符集均為SIMPLIFIED CHINESE_CHINA.UTF8,但是源端數(shù)據(jù)庫NLS_LENGTH_SEMANTICS參數(shù)的值為char,目標(biāo)數(shù)據(jù)庫NLS_LENGTH_SEMANTICS參數(shù)的值為byte
(2)郵件中對知識錯誤的理解:由于源端數(shù)據(jù)庫NLS_LENGTH_SEMANTICS參數(shù)的值為char(把1個漢字當(dāng)成一個字節(jié)),目標(biāo)數(shù)據(jù)庫NLS_LENGTH_SEMANTICS參數(shù)的值為byte(把1個漢字占3個字節(jié)),所以,源端Varchar2(16)能存儲16個漢字,而目標(biāo)端Varchar2(16)即只能存5個漢字,導(dǎo)致源數(shù)據(jù)的數(shù)據(jù)無法插入到目標(biāo)端數(shù)據(jù)庫中去
(3)郵件中錯誤的建議解決辦法:將目標(biāo)端數(shù)據(jù)庫的NLS_LENGTH_SEMANTICS參數(shù)的值,改成與源端數(shù)據(jù)庫NLS_LENGTH_SEMANTICS參數(shù)相同的值
2、知識的梳理
2.1 NLS_LENGTH_SEMANTICS參數(shù)的用途
NLS_LENGTH_SEMANTICS參數(shù)是一個專為創(chuàng)建CHAR和VARCHAR2兩種字符型的列時,指定使用的字節(jié)長度,還是使用字符長度的定義方式,有byte和char兩種值,默認(rèn)為byte。
當(dāng)設(shè)置該參數(shù)為BYTE時,定義CHAR列或VARCHAR2列采用字節(jié)長度方式;當(dāng)設(shè)置該參數(shù)為CHAR時,定義CHAR列或VARCHAR2列采用字符長度的方式。該參數(shù)對于數(shù)據(jù)庫中已經(jīng)存在的列不具備任何用途,只是在創(chuàng)建表,或修改表的列時才具有意義。
2.2 字節(jié)長度與字符長度的區(qū)別
此章節(jié)從百度文庫摘抄,原文地址為:https://baike.baidu.com/link?url=gtnaOI4rLZejxtdNISG3z8Vm1IpobqAB4nv3TRSnKh9RwTo2eR8eRkUWUUv00J7INVvGPQ2O51o-r77SfyIwT_
(1)ASCII碼:
一個英文字母(不分大小寫)占一個字節(jié)的空間,一個中文漢字占兩個字節(jié)的空間。一個二進(jìn)制數(shù)字序列,在計算機(jī)中作為一個數(shù)字單元,一般為8位二進(jìn)制數(shù),換算為十進(jìn)制。最小值0,最大值255。如一個ASCII碼就是一個字節(jié)。
(2)UTF-8編碼:
一個英文字符等于一個字節(jié),一個中文(含繁體)等于三個字節(jié)。
(3) Unicode編碼:
一個英文等于兩個字節(jié),一個中文(含繁體)等于兩個字節(jié)。
(4) 符號:
一個英文標(biāo)點(diǎn)占一個字節(jié),一個中文標(biāo)點(diǎn)占兩個字節(jié)。舉例:英文句號“.”占1個字節(jié)的大小,中文句號“。”占2個字節(jié)的大小。
3、郵件中對知識錯誤的理解
郵件中要求修改目標(biāo)端數(shù)據(jù)庫NLS_LENGTH_SEMANTICS參數(shù),是完全錯誤的解決方案,之所以出現(xiàn)這樣的情況,是因為此開發(fā)人員對NLS_LENGTH_SEMANTICS參數(shù)的理解不正確。
該開發(fā)人員,錯誤的將NLS_LENGTH_SEMANTICS參數(shù)理解成,只要該參數(shù)一改,數(shù)據(jù)庫中所有的涉及CHAR和VARCHAR2兩種字符型的列的長度類型都發(fā)生變化了。
其實不是,NLS_LENGTH_SEMANTICS參數(shù)的值,不對已經(jīng)存在的列產(chǎn)生任何影響,只是在創(chuàng)建表中的列時,默認(rèn)的指定列長度類型為byte還是char,如果在創(chuàng)建或修改表的列時指定了長度類型,完全覆蓋NLS_LENGTH_SEMANTICS參數(shù)的值。
4、剖析問題的真正原因
其實,該開發(fā)人員所面對的真正問題原因,是源端表字段的長度類型與目標(biāo)端表字段長度的類型不一致所致。
問題根本原因搞清楚了,解決方案就容易了,將目標(biāo)端表的字段長度類型修改成與源端一樣,不就解決了木。何必修改數(shù)據(jù)庫參數(shù)還重啟數(shù)據(jù)庫的。
下面以三條create table的語句說清楚NLS_LENGTH_SEMANTICS參數(shù)的用途
(1)兩條指定長度類型的SQL語句
create table tab_t(t_name varchar2(20byte));
create table tab_t(t_name varchar2(20char));
上面兩條語句,唯一的不同,就是在指定列長度為20后,再指定長度的類型,類型的值不同。
(2)不指定長度類型的SQL語句
create table tab_t(t_name varchar2(20));
這條語句,在指定列的長度為20后,并未指定長度的類型,那它的類型會是什么呢,這個就是由NLS_LENGTH_SEMANTICS參數(shù)的值所決定了,該參數(shù)值可以在會話級設(shè)定。
5、測試驗證
5.1 確認(rèn)數(shù)據(jù)庫的字符集類型
SQL> select *from nls_database_parameters t where t.parameter='NLS_CHARACTERSET';
PARAMETER VALUE ------------------------------ -------------------------------------- NLS_CHARACTERSET AL32UTF8
5.2 創(chuàng)建列長度類型為byte的表并測試可插入數(shù)據(jù)長度
(1)查看NLS_LENGTH_SEMANTICS參數(shù)當(dāng)前值
SQL> selectname,value from v$parameter where upper(name)='NLS_LENGTH_SEMANTICS';
NAME VALUE ------------------------------ ------------------------------- nls_length_semantics BYTE
(2)創(chuàng)建帶列長度類型為byte的表
SQL>create table tab_t(t_name varchar2(3));
(3)查看新創(chuàng)建的tab_t表的t_name列長度類型
SQL>select table_name,column_name,data_type,char_usedfrom dba_tab_columns where table_name='TAB_T'
TABLE_NAME COLUMN_NAME DATA_TYPE CHAR_USED -------------------- ----------------------- ------------------------- ----------------------------- TAB_T T_NAME VARCHAR2 B
(4)插入英文字符串?dāng)?shù)據(jù)測試
$ export NLS_LANG=AMERICAN_AMERICA.UTF8
--注意上面這一條,設(shè)置客戶端字符集很重要,如果環(huán)境變量有設(shè)置,此步可以跳過。如果發(fā)生復(fù)雜的字符集轉(zhuǎn)換,一個中文漢字有可能會占用6個字節(jié)
SQL> insert into tab_t values ('ZHO');
1 row created.
SQL> insert into tab_t values ('ZHON');
insert into tab_t values ('ZHON')
*
ERROR at line 1:
ORA-12899: value too large for column "SYS"."TAB_T"."T_NAME" (actual: 4,maximum: 3)
從上面測試數(shù)據(jù)來看,插入三個英文字母成功,在插入四個字母的字符串時失敗,提示實際長度為4,但maximum只有3
(5) 插入中文字符串?dāng)?shù)據(jù)測試
1)先計劃一下“中”字占用幾個字節(jié)
SQL> SELECT LENGTHB('中') FROM DUAL;
LENGTHB('中')
-------------
3
2)插入一個中文漢字
SQL> insert into tab_t values ('中');
1 row created.
3)插入兩個中文漢字
SQL> insert into tab_t values ('中國');
insert into tab_t values ('中國')
*
ERROR at line 1:
ORA-12899: value too large for column "SYS"."TAB_T"."T_NAME" (actual: 6, maximum: 3)
插入兩個中文漢字失敗,實際長度為6,字段maximum只有3,在此驗證確定,在UTF8下,一個中文漢字占3個字符。
5.3 將tab_t表的t_name列更改成char長度類型并做可插入長度測試
(1)將tab_t表的t_name列長度類型更改成char
SQL>alter table tab_t modify (t_name varchar2(3char));
(2)驗證修改結(jié)果
SQL> selecttable_name,column_name,data_type,char_used from dba_tab_columns wheretable_name='TAB_T' ;
TABLE_NAME COLUMN_NAME DATA_TYPE CHAR_USED -------------------- ----------------------- ------------------------- ----------------------------- TAB_T T_NAME VARCHAR2 C
(3) 插入兩個中文漢字
SQL> insert into tab_t values ('中國');
1 row created.
varchar2(3 char)插入兩個中文漢字成功
6、小結(jié)
經(jīng)過對開發(fā)人員的需求進(jìn)行判斷,以及糾正其對NLS_LENGTH_SEMANTICS參數(shù)用途錯誤的理解,用修改表字段長度類型的方式解決其面臨的實際問題,避免了一次不必要的數(shù)據(jù)庫重啟,以及問題得到真正的解決。
#########2
oracle導(dǎo)出、導(dǎo)入表和字段的注釋
--導(dǎo)出表的注釋
set heading off;
set echo off;
set feedback off;
set termout on;
spool C: able_comment.sql;
SELECT 'comment on table ' || t.table_name || ' is ''' || t.comments ||''';' FROM user_tab_comments t;
spool off;
--導(dǎo)入表的注釋
@ C: able_comment.sql;
--導(dǎo)出表字段的注釋
set heading off;
set echo off;
set feedback off;
set termout on;
spool C:column_comment.sql;
SELECT 'comment on column ' || t.table_name || '.' || t.column_name || ' is ''' || t.comments ||''';' FROM user_col_comments t;
spool off;
--導(dǎo)入表字段的注釋
@ C:column_comment.sql;
https://blog.csdn.net/shipeng1022/article/details/53066558
oracle 數(shù)據(jù)導(dǎo)入 數(shù)據(jù)和備注(comment)亂碼問題解決辦法
總結(jié)
以上是生活随笔為你收集整理的数据库的 2个参数 NLS_LENGTH_SEMANTICS 说明,comment 说明的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 键盘keydown值表
- 下一篇: (已解决)阿里云部署项目 阿里大于短信功