我想我读到了NLS_CHARACTERSET有数据库的编码,NLS_LANG有客户机的编码。对吗?
这是否意味着这两种编码可能是不同的?
在其他一些文档中,我看到NLS_LANG是由NLS_CHARACTERSET定义的。哪个断言是正确的?
发布于 2018-06-06 14:55:35
要理解NLS参数可能非常繁琐,我建议在正式文档中搜索“设置全球化支持环境”这个术语。
NLS是National Language Support的缩写,是各种Oracle产品中可用的多个参数的开始。
NLS_LANG被描述为定义客户端环境的<LANGUAGE>_<TERRITORY>.<CHARACTER_SET>的变量。
有效的NLS_LANG设置的一个示例是:
NLS_LANG=AMERCICAN_AMERICA.US7ASCII变量的各个部分定义Oracle如何显示信息。如果您的<LANGUAGE>是AMERICAN,那么消息、日数和月份将使用美式拼写显示。排序也受参数的这一部分的影响。
领土影响默认日期、货币值设置(例如$符号)和数字格式(例如,显示300万点12的3,000,000.12 )。
这是它变得非常有趣的地方。NLS_LANG参数的这一部分描述为
客户端应用程序使用的...character集。
因此,本质上,您正在配置客户端将如何显示存储在数据库中的数据。如果数据库包含以下数据:
Employee | Employment Start | Salary
--------------+---------------------+--------
Michael Ward | 2018-01-01 | 100240...then如果客户端将AMERICAN_AMERICA.US7ASCI设置为NLS_LANG设置,则查询此表将返回:
Employee | Employment Start | Salary
--------------+----------------------+-------------
Michael Ward | 01-JAN-18 | 100,240...whereas设置为FRENCH_FRANCE.WE8ISO8859P1将导致:
Employee | Employment Start | Salary
--------------+----------------------+-------------
Michael Ward | 01/01/18 | 100'240让我们跟进另一个参数..。
NLS_CHARACTERSET参数是在创建数据库实例期间设置的,以后不应该更改。(它可以更改,但即使在数据字典对象中也会导致数据损坏)。中的数据编码。
表的CHAR、VARCHAR2、LONG和CLOB列。
表的NCHAR、NVARCHAR2和NCLOB列。
该参数用于告诉RDBMS系统,用该系统编码它可以将数据存储在某些列中。
我故意忽略了关于NLS_CHARACTERSET的大部分解释,因为在比较AL8UTF8__、AL32UTF8和AL16UTF16 (只能与NLS_NCHAR_CHARACTERSET参数一起使用)和所有其他可能的Unicode设置时,它变得非常复杂。
当从数据库列检索数据时,NLS_LANG将向正在检索的数据添加所有花哨(日期格式、时间格式、数字格式)。
NLS_CHARACTERSET参数定义了将数据编码存储在列中的方法。(ASCII,Unicode,.)
这是否意味着这两种编码可能是不同的?
是的,你可以有两种完全不同的编码。您可以使用NLS_CHARACTERSET = AL32UTF8设置来存储数据,还可以使用NLS_LANG=American_America.US7ASCII显示数据并将其传输到数据库。
显示与存储
发布于 2018-06-06 13:20:38
他们可以是不同的。简短的解释是,这些字符存储在由NLS_CHARACTERSET定义的数据库中。如果客户端无法使用此字符集。NLS_LANG也持有区域。如果客户端使用数据库所期望的不同的货币、日期格式、小数点/逗号,那么这也可能有所不同。
https://dba.stackexchange.com/questions/208894
复制相似问题