数据库环境:11.2.0.3
pl/sql developer version 7.1.4
数据库NLS相关参数:
SQL> show parameter nls
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
nls_calendar string
nls_comp string BINARY
nls_currency string
nls_date_format string
nls_date_language string
nls_dual_currency string
nls_iso_currency string
nls_language string AMERICAN
nls_length_semantics string BYTE
nls_nchar_conv_excp string FALSE
nls_numeric_characters string
nls_sort string
nls_territory string AMERICA
nls_time_format string
nls_time_tz_format string
nls_timestamp_format string
nls_timestamp_tz_format string
数据库字符集:NLS Database Parameters
Parameter Value
NLS_CALENDAR GREGORIAN
NLS_CHARACTERSET ZHS16GBK
NLS_COMP BINARY
NLS_CURRENCY $
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE AMERICAN
NLS_DUAL_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_LANGUAGE AMERICAN
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_NCHAR_CONV_EXCP FALSE
NLS_NUMERIC_CHARACTERS .,
NLS_RDBMS_VERSION 11.2.0.1.0
NLS_SORT BINARY
NLS_TERRITORY AMERICA
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_TIME_FORMAT HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
windows 7客户端字符集:NLS_LANG SIMPLIFIED CHINESE_CHINA.ZHS16GBK
奇怪的现象:同事向一个表中插入数据时,某列下老是少一个字符(应该为3个字符)
表结构:SQL> desc test1
Name Type Nullable Default Comments
------------------------- -------------- -------- ------- --------
SAFE_CODE NVARCHAR2(3)
SAFE_SHORTNAME_IN_CHINESE NVARCHAR2(100) Y
SAFE_SHORTNAME NVARCHAR2(100) Y
NATIONALITY_CODE NVARCHAR2(3) Y
COUNTRY_CODE NVARCHAR2(3) Y
插入的数据是:SAFE_CODE SAFE_SHORTNAME_IN_CHINESE SAFE_SHORTNAME NATIONALITY_CODE COUNTRY_CODE
ABW 阿鲁巴 ARUBA AW
AFG 阿富汗 AFGHANISTAN AFG AF
AGO 安哥拉 ANGOLA AGO AO
AIA 安圭拉 ANGUILLA KNA AI
ALB 阿尔巴尼亚 ALBANIA ALB AL
AND 安道尔 ANDORRA AD
ANT 荷属安的列斯 NETHERLANDS ANTILLES ANT AN
ARE 阿联酋 UNITED ARAB EMIRATES ARE AE
ARE 阿联酋 UNITED ARAB EMIRATES UAE AE
ARG 阿根廷 ARGENTINA ARG AR
ARM 亚美尼亚 ARMENIA ARM AM
ASM 美属萨摩亚 AMERICAN SAMOA AS
ATA 南极洲 ANTARCTICA AQ
ATF 法属南部领地 FRENCH SOUTHERN TERRITORIES TF
ATG 安提瓜和巴布达 ANTIGUA AND BARBUDA AG
AUS 澳大利亚 AUSTRALIA AUS AU
AUT 奥地利 AUSTRIA AUT AT
AZE 阿塞拜疆 AZERBAIJAN AZE AZ
BDI 布隆迪 BURUNDI BDI BI
BEL 比利时 BELGIUM BEL BE
BEN 贝宁 BENIN BEN BJ
BFA 布基纳法索 BURKINA FASO BFA BF
BGD 孟加拉国 BANGLADESH BDN BD
插入完数据后查看会发现:SAFE_CODE SAFE_SHORTNAME_IN_CHINESE SAFE_SHORTNAME NATIONALITY_CODE COUNTRY_CODE
AB 阿鲁巴 ARUBA AW
AF 阿富汗 AFGHANISTAN AF AF
AG 安哥拉 ANGOLA AG AO
AI 安圭拉 ANGUILLA KN AI
AL 阿尔巴尼亚 ALBANIA AL AL
SAFE_CODE 和NATIONALITY_CODE 都少了一个字符。
解决方法就是:把nvarchar2类型改为varchar2就可以了。
非常郁闷,为什么会出现这样的情况,更郁闷的是问题解决后在实验环境中没法重现,折腾了老长时间。
希望大牛们给出意见。