mlwacosmos Asked: 2018-06-07 04:32:07 +0800 CST2018-06-07 04:32:07 +0800 CST 2018-06-07 04:32:07 +0800 CST NLS_LANG 和 NLS_CHARACTERSET 772 我以为我读到NLS_CHARACTERSET了数据库NLS_LANG的编码和客户端的编码。那是对的吗? 这是否意味着两种编码可以不同? 在其他一些文档中,我读到NLS_LANG是由NLS_CHARACTERSET. 哪个断言是正确的? oracle encoding 3 个回答 Voted Best Answer John K. N. 2018-06-07T06:55:35+08:002018-06-07T06:55:35+08:00 NLS 参数可能很难理解,我建议在官方文档中搜索术语“设置全球化支持环境”。 NLS 是 National Language Support 的缩写,是各种 Oracle 产品中可用的多个参数的开始。 NLS_LANG NLS_LANG被描述为定义<LANGUAGE>_<TERRITORY>.<CHARACTER_SET>客户端环境的变量。 一个有效的 NLS_LANG 设置示例如下: NLS_LANG=AMERCICAN_AMERICA.US7ASCII 语 变量的各个部分定义了 Oracle 如何显示信息。如果您<LANGUAGE>是AMERICAN那么消息,日期和月份将使用美式拼写显示。排序也受这部分参数的影响 领土 区域会影响默认日期、货币值设置(例如$符号)和数字格式(例如3,000,000.12显示 300 万点 12)等内容 字符集 这是它变得非常有趣的地方。NLS_LANG 参数的这一部分被描述为 ...客户端应用程序使用的字符集。 摘要 NLS_LANG 因此,本质上,您正在配置客户端如何显示存储在数据库中的数据。如果您的数据库包含以下数据: Employee | Employment Start | Salary --------------+---------------------+-------- Michael Ward | 2018-01-01 | 100240 ...然后,如果您的客户端具有AMERICAN_AMERICA.US7ASCI该NLS_LANG设置,则查询此表将返回: Employee | Employment Start | Salary --------------+----------------------+------------- Michael Ward | 01-JAN-18 | 100,240 ...而设置FRENCH_FRANCE.WE8ISO8859P1会导致: Employee | Employment Start | Salary --------------+----------------------+------------- Michael Ward | 01/01/18 | 100'240 让我们跟进另一个参数... NLS_CHARACTERSET 该NLS_CHARACTERSET参数是在创建数据库实例期间设置的,此后不应更改。(它可以更改,但即使在 DATA DICTIONARY 对象中也会导致数据损坏)。此参数定义数据在 ... NLS_CHARACTERSET 参数 ... CHAR, VARCHAR2,LONG和CLOB表的列。 NLS_NCHAR_CHARACTERSET 参数 ... NCHAR,NVARCHAR2以及NCLOB表格的列。 摘要 NLS_CHARACTERSET 该参数用于告诉 RDBMS 系统使用哪种编码将数据存储在某些列中。 我故意留下了大部分关于NLS_CHARACTERSETout 的解释,因为在比较AL8UTF8, AL32UTF8and AL16UTF16(只能与NLS_NCHAR_CHARACTERSET参数一起使用)和所有其他可能的 Unicode 设置之间的编码时,它变得非常复杂。 比较 从数据库列中检索数据时,NLS_LANG会将所有花里胡哨(日期格式、时间格式、数字格式)添加到正在检索的数据中。 该NLS_CHARACTERSET参数定义数据存储在列中的编码方式。(ASCII,Unicode,...) 回答你的问题 这是否意味着两种编码可以不同? 是的,你可以有两种完全不同的编码。您可以使用 的设置来存储数据,NLS_CHARACTERSET = AL32UTF8并且仍然可以使用NLS_LANG=American_America.US7ASCII. 显示与存储 Marco 2018-06-07T05:20:38+08:002018-06-07T05:20:38+08:00 它们可以不同。简短的解释是字符存储在数据库中,如NLS_CHARACTERSET. 如果客户端无法使用此字符集。NLS_LANG也持有地区。如果客户端使用数据库预期的不同货币、日期格式、小数点/逗号,那么这也可能不同。 Wernfried Domscheit 2018-06-11T23:20:40+08:002018-06-11T23:20:40+08:00 是的,您的假设是正确的(请参阅其他答案) 这是否意味着两种编码可以不同? 是的,事实上,如果你认为你的数据库有两个字符集,它们总是不同的,你可以在一个语句中同时使用它们。NLS_CHARACTERSETNLS_NCHAR_CHARACTERSET NLS_CHARACTERSET并且NLS_NCHAR_CHARACTERSET通常是不同的。因此NLS_LANG与 不同NLS_CHARACTERSET或不同NLS_NCHAR_CHARACTERSET。 您可以在NLS_LANG 常见问题解答中找到一些有用的信息 在其他一些文档中,我读到NLS_LANG是由NLS_CHARACTERSET. 哪个断言是正确的? 这种说法似乎是错误的。但是,我的印象是,TOAD首先打开一个数据库连接,读取NLS_CHARACTERSET值,然后打开NLS_LANG根据先前读取设置的“最终”数据库连接NLS_CHARACTERSET。但这似乎是一种相当复杂的方法。
NLS 参数可能很难理解,我建议在官方文档中搜索术语“设置全球化支持环境”。
NLS 是 National Language Support 的缩写,是各种 Oracle 产品中可用的多个参数的开始。
NLS_LANG
NLS_LANG
被描述为定义<LANGUAGE>_<TERRITORY>.<CHARACTER_SET>
客户端环境的变量。一个有效的 NLS_LANG 设置示例如下:
语
变量的各个部分定义了 Oracle 如何显示信息。如果您
<LANGUAGE>
是AMERICAN
那么消息,日期和月份将使用美式拼写显示。排序也受这部分参数的影响领土
区域会影响默认日期、货币值设置(例如
$
符号)和数字格式(例如3,000,000.12
显示 300 万点 12)等内容字符集
这是它变得非常有趣的地方。NLS_LANG 参数的这一部分被描述为
摘要 NLS_LANG
因此,本质上,您正在配置客户端如何显示存储在数据库中的数据。如果您的数据库包含以下数据:
...然后,如果您的客户端具有
AMERICAN_AMERICA.US7ASCI
该NLS_LANG
设置,则查询此表将返回:...而设置
FRENCH_FRANCE.WE8ISO8859P1
会导致:让我们跟进另一个参数...
NLS_CHARACTERSET
该
NLS_CHARACTERSET
参数是在创建数据库实例期间设置的,此后不应更改。(它可以更改,但即使在 DATA DICTIONARY 对象中也会导致数据损坏)。此参数定义数据在 ...NLS_CHARACTERSET 参数
...
CHAR
,VARCHAR2
,LONG
和CLOB
表的列。NLS_NCHAR_CHARACTERSET 参数
...
NCHAR
,NVARCHAR2
以及NCLOB
表格的列。摘要 NLS_CHARACTERSET
该参数用于告诉 RDBMS 系统使用哪种编码将数据存储在某些列中。
我故意留下了大部分关于
NLS_CHARACTERSET
out 的解释,因为在比较AL8UTF8
,AL32UTF8
andAL16UTF16
(只能与NLS_NCHAR_CHARACTERSET
参数一起使用)和所有其他可能的 Unicode 设置之间的编码时,它变得非常复杂。比较
从数据库列中检索数据时,
NLS_LANG
会将所有花里胡哨(日期格式、时间格式、数字格式)添加到正在检索的数据中。该
NLS_CHARACTERSET
参数定义数据存储在列中的编码方式。(ASCII,Unicode,...)回答你的问题
是的,你可以有两种完全不同的编码。您可以使用 的设置来存储数据,
NLS_CHARACTERSET = AL32UTF8
并且仍然可以使用NLS_LANG=American_America.US7ASCII
.它们可以不同。简短的解释是字符存储在数据库中,如
NLS_CHARACTERSET
. 如果客户端无法使用此字符集。NLS_LANG
也持有地区。如果客户端使用数据库预期的不同货币、日期格式、小数点/逗号,那么这也可能不同。是的,您的假设是正确的(请参阅其他答案)
是的,事实上,如果你认为你的数据库有两个字符集,它们总是不同的,你可以在一个语句中同时使用它们。
NLS_CHARACTERSET
NLS_NCHAR_CHARACTERSET
NLS_CHARACTERSET
并且NLS_NCHAR_CHARACTERSET
通常是不同的。因此NLS_LANG
与 不同NLS_CHARACTERSET
或不同NLS_NCHAR_CHARACTERSET
。您可以在NLS_LANG 常见问题解答中找到一些有用的信息
这种说法似乎是错误的。但是,我的印象是,
TOAD
首先打开一个数据库连接,读取NLS_CHARACTERSET
值,然后打开NLS_LANG
根据先前读取设置的“最终”数据库连接NLS_CHARACTERSET
。但这似乎是一种相当复杂的方法。