我以为我读到NLS_CHARACTERSET
了数据库NLS_LANG
的编码和客户端的编码。那是对的吗?
这是否意味着两种编码可以不同?
在其他一些文档中,我读到NLS_LANG
是由NLS_CHARACTERSET
. 哪个断言是正确的?
NLS 参数可能很难理解,我建议在官方文档中搜索术语“设置全球化支持环境”。
NLS 是 National Language Support 的缩写,是各种 Oracle 产品中可用的多个参数的开头。
NLS_LANG
被描述为定义<LANGUAGE>_<TERRITORY>.<CHARACTER_SET>
客户端环境的变量。
一个有效的 NLS_LANG 设置的例子是:
NLS_LANG=AMERCICAN_AMERICA.US7ASCII
Run Code Online (Sandbox Code Playgroud)
变量的各个部分定义了 Oracle 如何显示信息。如果您<LANGUAGE>
是,AMERICAN
则消息、日期和月份将使用美式拼写显示。排序也受这部分参数影响
区域会影响默认日期、货币值设置(例如$
符号)和数字格式(例如3,000,000.12
显示 300 万点 12)等内容
这是它变得非常有趣的一点。NLS_LANG 参数的这部分被描述为
...客户端应用程序使用的字符集。
因此,本质上您是在配置客户端如何显示存储在数据库中的数据。如果您的数据库包含以下数据:
Employee | Employment Start | Salary
--------------+---------------------+--------
Michael Ward | 2018-01-01 | 100240
Run Code Online (Sandbox Code Playgroud)
...然后如果您的客户端具有AMERICAN_AMERICA.US7ASCI
作为NLS_LANG
设置,则查询此表将返回:
Employee | Employment Start | Salary
--------------+----------------------+-------------
Michael Ward | 01-JAN-18 | 100,240
Run Code Online (Sandbox Code Playgroud)
...而有一个设置FRENCH_FRANCE.WE8ISO8859P1
会导致:
Employee | Employment Start | Salary
--------------+----------------------+-------------
Michael Ward | 01/01/18 | 100'240
Run Code Online (Sandbox Code Playgroud)
让我们跟进另一个参数......
该NLS_CHARACTERSET
参数是在创建数据库实例期间设置的,此后不应更改。(它可以更改,但即使在 DATA DICTIONARY 对象中也可能导致数据损坏)。该参数定义了数据的编码...
... CHAR
, VARCHAR2
,LONG
和CLOB
表的列。
... NCHAR
,NVARCHAR2
以及NCLOB
表的列。
该参数用于告诉 RDBMS 系统使用哪种编码将数据存储在某些列中。
我有意留下了大部分关于NLS_CHARACTERSET
out的解释,因为在比较AL8UTF8
, AL32UTF8
and AL16UTF16
(只能与NLS_NCHAR_CHARACTERSET
参数结合使用)和所有其他可能的 Unicode 设置之间的编码时,它变得非常复杂。
从数据库列检索数据时,NLS_LANG
会将所有花里胡哨(日期格式、时间格式、数字格式)添加到正在检索的数据中。
该NLS_CHARACTERSET
参数定义将数据存储在列中的编码。(ASCII,Unicode,...)
这是否意味着两种编码可以不同?
是的,您可以有两种完全不同的编码。您可以使用 的设置存储数据,NLS_CHARACTERSET = AL32UTF8
并且仍然使用NLS_LANG=American_America.US7ASCII
.
显示与存储