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 / 问题 / 1301
Accepted
bernd_k
bernd_k
Asked: 2011-02-18 09:58:17 +0800 CST2011-02-18 09:58:17 +0800 CST 2011-02-18 09:58:17 +0800 CST

Oracle 的 VARCHAR 和 VARCHAR2 数据类型有什么区别?

  • 772

将来自其他 DBMS 的表迁移到 Oracle 时,标准任务之一是将所有VARCHAR(n)字段替换为VARCHAR2(n)字段(前提是 n <= 4000)。

为什么 Oracle 将这种数据类型称为这种数据类型VARCHAR2,而不是VARCHAR像其他 DBMS 那样?

oracle datatypes
  • 4 4 个回答
  • 25003 Views

4 个回答

  • Voted
  1. Best Answer
    Leigh Riffel
    2011-02-18T10:12:51+08:002011-02-18T10:12:51+08:00

    似乎 Oracle 曾经计划为VARCHAR提供与VARCHAR2不同的定义。它已经告诉客户这一点,并建议不要使用VARCHAR。无论他们的计划是什么,从 11.2.0.2 开始,VARCHAR与VARCHAR2相同。下面是SQL 语言参考 11g 第 2 版所说的:

    不要使用 VARCHAR 数据类型。请改用 VARCHAR2 数据类型。尽管 VARCHAR 数据类型目前是 VARCHAR2 的同义词,但与不同的比较语义相比,VARCHAR 数据类型计划被重新定义为用于可变长度字符串的单独数据类型。

    PL/SQL 用户指南和参考 10g 第 2 版是这样说的:

    目前,VARCHAR 是 VARCHAR2 的同义词。但是,在未来的 PL/SQL 版本中,为了适应新兴的 SQL 标准,VARCHAR 可能成为具有不同比较语义的单独数据类型。使用 VARCHAR2 而不是 VARCHAR 是个好主意。

    Database Concepts 10g 第 2 版文档用更强烈的措辞说了同样的话:

    VARCHAR 数据类型与 VARCHAR2 数据类型同义。为避免可能的行为变化,请始终使用 VARCHAR2 数据类型来存储可变长度字符串。

    Oracle 9.2 和 8.1.7 文档说的基本相同,因此即使 Oracle 一直不鼓励使用VARCHAR,到目前为止,他们还没有做任何事情来改变它与VARCHAR2的奇偶性。

    • 26
  2. Justin Cave
    2011-02-18T11:13:46+08:002011-02-18T11:13:46+08:00

    目前,两者是同义词。

    VARCHAR 是 ANSI 标准数据类型,但 Oracle 对 VARCHAR 数据类型的实现违反了 ANSI 标准,将空字符串视为 NULL(Oracle 的实现早于 ANSI 标准)。正如 Leigh 所指出的,Oracle 已声明 VARCHAR 数据类型的语义在未来可能会根据处理空字符串的方式发生变化。如果发生这种情况,VARCHAR2 数据类型的语义将保持不变。使用 VARCHAR2 数据类型更安全,因为您不必担心某些未来版本的 Oracle 会通过导致空字符串不再被视为 NULL 来破坏您的代码。

    • 26
  3. Gaius
    2011-02-18T10:00:50+08:002011-02-18T10:00:50+08:00

    因为在最初的 SQL 标准中,VARCHAR 是 255 个字符,而当时 Oracle 至少在标准合规性方面有所尝试。

    • 2
  4. Sourav Nag
    2021-08-20T22:01:00+08:002021-08-20T22:01:00+08:00

    目前 VARCHAR2 通过使用基于字符数的字节来优化内存使用。这意味着,如果 VARCHAR2(10) 变量包含较少数量的字符,它可以使用 2、4、5、6 等字节的内存。

    而 VARCHAR 是固定大小。VARCHAR(10) 将始终保存 10 个字节的内存。

    • -2

相关问题

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

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

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

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

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

Sidebar

Stats

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

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

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

    • 4 个回答
  • Marko Smith

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

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +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
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +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