AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 208894
Accepted
mlwacosmos
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 3 个回答
  • 10379 Views

3 个回答

  • Voted
  1. 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.

    显示与存储

    • 5
  2. Marco
    2018-06-07T05:20:38+08:002018-06-07T05:20:38+08:00

    它们可以不同。简短的解释是字符存储在数据库中,如NLS_CHARACTERSET. 如果客户端无法使用此字符集。NLS_LANG也持有地区。如果客户端使用数据库预期的不同货币、日期格式、小数点/逗号,那么这也可能不同。

    • 0
  3. 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。但这似乎是一种相当复杂的方法。

    • 0

相关问题

  • Oracle 中的数据库备份 - 导出数据库还是使用其他工具?

  • ORDER BY 使用文本列的自定义优先级

  • 舒服的sqlplus界面?[关闭]

  • 如何在数据库中找到最新的 SQL 语句?

  • 如何使用正则表达式查询名称?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve