不能坐视了!Oracle数据库varchar2字段扩容,每月总有那么一两次。----- 优秀的程序应总是尽可能地规避问题

这篇具有很好参考价值的文章主要介绍了不能坐视了!Oracle数据库varchar2字段扩容,每月总有那么一两次。----- 优秀的程序应总是尽可能地规避问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Oracle数据库varchar2字段扩容-始末

今天,有后端小伙伴提了个sql工单。对我司服务商系统Oracle数据库的一个mer_name字段扩容。

alter table T_MER_SETTLE modify mer_name VARCHAR2(100)

审批前,我查了一下当前这个mer_name字段的长度是 VARCHAR2(64)。

基于对我司客户名称的长度通常不超过64字的了解,我下意识里感到奇怪:莫非存在长度超过64个文字的客户名称?这种情况应该很少吧?什么公司的名字能有这么长呢?

 文章来源地址https://www.toymoban.com/news/detail-825166.html

然后,我找当事人来询问。他言说,当时开发需求时,看到企业表里的mer_name是varchar2(100),就沿袭使用varchar2了,加上对系统里企业名称长度通常不会超过64个汉字的认识,就把新表的mer_name定义为varchar2(64)。 今天生产环境的告警显示,在向这个T_MER_SETTLE表插入数据时出现“字段值超长”持久化失败的bug,这才得知Oracle的varchar2(64)与mysql的varchar(64)不同,mysql的varchar(64)能存最多64个字符,而Oracle的varchar2(64)则不同。在数据库字符集是UTF-8的情况下,varchar2在存汉字时,是每个汉字占3个字节。也就是说,这个varchar2(64)最多可以存64/3=21个汉字。

 

本着解决问题优先的原则,我审批了sql工单并执行sql。

 

优秀的程序应该尽可能地规避问题

不能坐视了!Oracle数据库varchar2字段扩容,每月总有那么一两次。----- 优秀的程序应总是尽可能地规避问题

字段扩容,这是我们日常开发中经常遇到的小事。我们服务商系统类似对varchar2字段扩容的案例,几乎每月都发生。那么,针对这个字段扩容,大家有没有琢磨过,我们如何在开发时就能规避呢?

优秀的程序应该尽可能地规避问题。我们来复盘一下这个事情。

有必要先说明一个情况,我司绝大多数系统以mysql数据库为主,服务商系统是其中唯一一个使用Oracle数据库的小众系统。并且,服务商系统的日常维护或需求迭代较少,由我们技术团队中的三个同学抽一部分精力兼管。 因此,大家对Oracle数据库了解得并不多,相比mysql,就少多了。

好,继续来复盘。
开发人员不了解varchar2这个技术点,凭着mysql数据库经验和对业务的了解,定义了  mer_name VARCHAR2(64) 。
我在审批时,也不了解varcahr2这个技术点,就去反问开发同学。同样,其他同学,也未必清楚Oracle的varchar2这个数据类型的细节。

 

那么,如何规避呢?

无药可救了吗?

不!

我们事后了解到,Oracle的nvarchar2不区分字符类型,它将汉字、全角符号与数字、字母、半角符号等均视为一个字符。也就是说,nvarchar2(64)表示可存最大64个字符。注意这里不是字节,而是字符。 包括 数字、字母、符号、以及汉字。同时,在存储含有文字的字段时,Oracle开发规范里建议使用nvarchar2取代varchar2。

因此,我们可以做什么?

将数据库里的mer_name的数据类型全部改为nvarchar2,以及其他的这种varchar2字段类型使用不当的字段。

这以后,服务商系统再有迭代开发时,开发者CV时,就不会(或很少)再有varchar2的mer_name了,乐观一点讲,再出现因varchar2数据类型使用不当而导致“字段值超长”持久化失败的bug就会扼杀在摇篮里。

 

【附】Oracle数据类型varchar2与nvarchar2

  1. varchar - Oracle不建议使用varchar类型(我在DBeaver中新建varchar字段时自动建成了varchar2,无论是所见即所得的操作方式,还是执行DDL方式)
  2. varchar2 - varchar2(20) 表示可存最大20个字节长度的字符串。 数字/字母/半角符号 占一个字节。 对于全角符号或汉字,则要看字符集,GBK的话,一个汉字占2个字节;UTF-8的话,一个汉字占3个字节。
  3. nvarchar - Oracle中没有nvarchar这个数据类型
  4. nvarchar2 - nvarchar2(20) 表示可存最大20个字符。注意这里不是字节了,而是字符。 包括 数字、字母、符号、以及汉字。每个字符占2个字节存储。
 
  • varchar2是Oracle提供的特定数据类型,Oracle可以保证varchar2在任何版本中该数据类型都可以向上或向下兼容。
  • nvarchar2虽然更占空间,但是它有更好的兼容性。尤其是当字段包含汉字的情况下,推荐使用nvarchar2。  - - - - - - - - 我们服务商系统Oracle数据库里,对于mer_name等包含汉字的字段,大家往往沿袭使用varchar2(100甚至更大),我们在新建表里涉及到这个字段时,有开发者会误以为Oracle的varchar2与mysql里的varchar相同,我们mysql应用里约定mer_name是varchar(32) ,就在Oracle库里定义成了 varchar2(32) ,结果,服务商系统在生产运行过程中,出现插入mer_name因字段值超长而持久化数据库失败。 - - - - - - - - 优秀的程序应总是尽可能地规避问题。因此,以后在服务商系统里,当定义包含汉字的字段时,使用 nvarchar2,而非 varchar2。 因此,在服务商系统作为我司系统的小众系统的背景下,Oracle的技术特性我们不一一晓知是可以理解和接受的。而如何在不一一晓知这些技术特性的情况下,能够规避这些技术特性带来的bug,需要我们引起思考和实践摸索。
 

 【附】字段值超长,程序异常截图↓

不能坐视了!Oracle数据库varchar2字段扩容,每月总有那么一两次。----- 优秀的程序应总是尽可能地规避问题

 

到了这里,关于不能坐视了!Oracle数据库varchar2字段扩容,每月总有那么一两次。----- 优秀的程序应总是尽可能地规避问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [SQL Server]SQL Server数据库中如何将时间日期类型(DateTime)转换成字符串类型(varchar,nvarchar)

    SQL Server数据库中,如何将时间日期类型(DateTime)的数据转换成字符串类型(varchar,nvarchar),并对其进行 yyyy-mm-dd 形式的格式化输出 使用SQL Server的 CONVERT() 函数,如下: SELECT LEFT(CONVERT(VARCHAR, GETDATE(), 120), 10) 或者 SELECT CONVERT(VARCHAR(10), GETDATE(), 120) 在SQL Server 2012及以上版本中,新增

    2024年02月07日
    浏览(68)
  • 数据库数据恢复-Oracle数据库数据恢复案例

    数据库数据恢复环境: Oracle数据库ASM磁盘组有4块成员盘。 数据库故障分析: Oracle数据库ASM磁盘组掉线 ,ASM实例无法挂载,用户联系我们要求恢复oracle数据库。 数据库数据恢复工程师拿到磁盘后,先将所有磁盘以只读方式进行扇区级别的镜像备份,后续的数据分析和数据恢

    2024年02月13日
    浏览(64)
  • Oracle数据库

    ①层次型数据库 ②网状型数据库 ③关系型数据库(主要介绍) E-R图:属性(椭圆形),实体(矩形),联系(菱形-一对一、一对多、多对多) 注:有的联系也有属性 关系型数据库的设计范式: 第一范式(1NF):属性不可再分,字段保证原子性 第二范式(2NF):在满足1

    2024年02月08日
    浏览(57)
  • Oracle 数据库恢复删除的数据

    需求描述: 同事让删除脏数据,结果删错了,需要恢复数据 思路: 利用闪回恢复数据只能恢复15分钟之内的,后面undo空间会被重写,就恢复不了,所以删除数据后,要谨慎再三确认,若发现不对,则利用闪回恢复 先查询删除时的时间节点的快照 查到时间戳之后 闪回恢复数

    2024年01月24日
    浏览(68)
  • 【数据库】日常使用PL/SQL 登录ORACLE 数据库查询数据

    一、PL/SQL 登录方式 username: ##访问数据库的账号 password: ##访问数据库的密码 Databse: ##数据库IP地址/实例名 数据库集群心跳地址/实例名 Connect as : ##Normal,如果使用sysdba账户登录选择SYSDBA 二、PL/SQL使用SQL语句查询 点击上方导航栏,New,选择SQL Window,即可再次输入要查询的

    2024年02月19日
    浏览(68)
  • Oracle数据库面试题 精选 Oracle 面试题

    1.解释冷备份和热备份的不同点以及各自的优点 冷备份 发生在数据库已经正常关闭的情况下,将关键性文件拷贝到另外位置的一种说法。适用于所有模式的数据库。 优点 1. 是非常快速的备份方法(只需拷贝文件) 2. 容易归档(简单拷贝即可) 3. 容易恢复到某个时间点上(只

    2024年02月05日
    浏览(99)
  • 【Oracle】收集Oracle数据库内存相关的信息

    【声明】文章仅供学习交流,观点代表个人,与任何公司无关。 编辑|SQL和数据库技术(ID:SQLplusDB) Oracle数据库包含多个内存区域,每个区域都包含多个子组件。 Oracle Database Memory Structures 根据具体问题的需要,可以通过如下命令收集Oracle数据库内存相关的信息。 例: 注:SET

    2024年01月21日
    浏览(67)
  • Oracle数据库概念简介

    一般意义上的数据库包含两个部分 库:就是一个存储一堆文件的文件目录 数据库管理系统:管理库的系统 数据库管理系统(Database Management System),是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称 DBMS ; 它对数据库进行统一的管理和控制,以保证数

    2024年02月09日
    浏览(49)
  • Oracle数据库完整卸载

    进入计算机管理,在服务中,找到oracle开头的所有服务,右击选择停止。 快捷键:ctrl+shift+esc打开任务管理器 点击开始菜单找到Oracle,然后点击Oracle安装产品,再点击Universal Installer。 点击之后稍等一会然后会进入进入下图界面,点击卸载产品。 单击“卸载产品”,选中除“Or

    2024年01月16日
    浏览(63)
  • 快速监控 Oracle 数据库

    Oracle 数据库在行业内应用广泛,通常存放的非常重要的数据,监控是必不可少的,本文使用 Cprobe 采集 Oracle 监控数据,极致简单,分享给大家。 安装配置 Oracle 简单起见,我使用 Docker 启动 Oracle,命令如下: 如上命令启动之后,Oracle 的监听端口是 1521,用户名/密码是 syst

    2024年01月20日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包