不能坐視了!Oracle資料庫varchar2欄位擴容,每月總有那麼一兩次。----- 優秀的程式應總是儘可能地規避問題

来源:https://www.cnblogs.com/buguge/p/17995321
-Advertisement-
Play Games

優秀的程式應該儘可能地規避問題。因此,以後在服務商系統里,當定義包含漢字的欄位時,使用 nvarchar2,而非 varchar2。 因此,在服務商系統作為我司系統的小眾系統的背景下,Oracle的技術特性我們不一一曉知是可以理解和接受的。而如何在不一一曉知這些技術特性的情況下,能夠規避這些技術特性... ...


Oracle資料庫varchar2欄位擴容-始末

今天,有後端小伙伴提了個sql工單。對我司服務商系統Oracle資料庫的一個mer_name欄位擴容。

alter table T_MER_SETTLE modify mer_name VARCHAR2(100)

審批前,我查了一下當前這個mer_name欄位的長度是 VARCHAR2(64)。

基於對我司客戶名稱的長度通常不超過64字的瞭解,我下意識里感到奇怪:莫非存在長度超過64個文字的客戶名稱?這種情況應該很少吧?什麼公司的名字能有這麼長呢?

 

然後,我找當事人來詢問。他言說,當時開發需求時,看到企業表裡的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。

 

優秀的程式應該儘可能地規避問題

欄位擴容,這是我們日常開發中經常遇到的小事。我們服務商系統類似對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,需要我們引起思考和實踐摸索。
 

 【附】欄位值超長,程式異常截圖↓

 


當看到一些不好的代碼時,會發現我還算優秀;當看到優秀的代碼時,也才意識到持續學習的重要!--buguge
本文來自博客園,轉載請註明原文鏈接:https://www.cnblogs.com/buguge/p/17995321



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 2024年1月2日,北京白鯨開源科技有限公司(以下簡稱"白鯨開源")榮幸宣佈,白鯨開源旗下產品 WhaleStudio V2.4 已成功通過與麒麟軟體有限公司旗下的銀河麒麟高級伺服器操作系統產品的相容性測試。 麒麟軟體有限公司的銀河麒麟高級伺服器操作系統(飛騰版)V10和銀河麒麟高級伺服器操作系統( ...
  • 本文介紹瞭如何通過子查詢優化深度分頁查詢,以減少回表操作帶來的性能損耗。傳統的深度分頁查詢往往會面臨嚴重的性能問題,尤其在處理大量數據時更是如此。 ...
  • 本文介紹了在雲上環境的雙集群(不跨Region不跨VPC)後臺手動部署並使用細粒度容災的主要步驟,使得用戶能快速方便得搭建起細粒度容災。 ...
  • MySQL Shell 8.0.32 for GreatSQL編譯二進位包 構建MySQL Shell 8.0.32 for GreatSQL 0. 寫在前面 之前已經寫過一篇前傳 MySQL Shell 8.0.32 for GreatSQL編譯安裝,最近再次編譯MySQL Shell二進位包時, ...
  • 北京時間2024年2月20日,中國領先的開源技術公司,白鯨開源科技有限公司(以下簡稱"白鯨開源")榮幸宣佈,該公司獲得了第六屆 "年度金猿季大型主題策劃活動" 頒發的 "2023大數據產業年度最具投資價值" 獎項。這一殊榮是對白鯨開源在大數據領域取得的卓越成就和突出貢獻的認可。 金猿季推動產業升級 ...
  • 本文深度解析MySQL的COUNT(1), COUNT(*),COUNT(列)計數方式,強調COUNT(*)的廣泛應用與InnoDB存儲引擎的優化。通過性能比較,揭示COUNT(id)在索引下的性能,通過技術細節揭示MySQL查詢優化器的工作原理,最終總結適用場景,為讀者提供計數方式選擇的指導。 ...
  • 目錄MongoDB創建一張表用法示例資料分享系列文章clickhouse系列文章 MongoDB MongoDB 引擎是只讀表引擎,允許從遠程 MongoDB 集合中讀取數據(SELECT查詢)。引擎只支持非嵌套的數據類型。不支持 INSERT 查詢。 創建一張表 CREATE TABLE [IF ...
  • 工商銀行和華為雲牽頭,並聯合7家金融機構共同編製的《金融行業開放平臺資料庫轉型白皮書》榮獲2023年度十佳課題。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...