作者: admin

  • 在PHP 7.3使用interbase extension的function ibase_query, 當ibase_query有數值的argument時, 會出現找不到紀錄或出現錯誤訊息: “arithmetic exception, numeric overflow, or string truncation”

    分析:
    文字argument不會出現問題。在PHP 5運行時也沒有問題。

    解法:
    將數值變量直接嵌入query裡。

    教訓:

    1. 版本升級不只是「語法相容」
      同一套程式碼在 PHP 5 正常,在 PHP 7.3 出現 arithmetic exception, numeric overflow, or string truncation,代表底層 extension 或資料庫驅動行為已經改變,而不只是語言本身語法差異。

    看到「同一段 SQL、同一筆資料,在不同 PHP 版本結果不同」時,要優先懷疑:extension 的型別轉換、參數處理順序或預設設定是否改變,而不是只從 SQL 邏輯著手。

    1. 數值參數與文字參數的行為差異要特別警惕
      問題只在「數值型」 argument 出現,而文字 argument 正常,說明 ibase 擴展在處理 PHP 的 int/float 轉 Firebird/InterBase 的 numeric/decimal 時,可能有額外的轉型或精度問題。

    將同一個變量改成字串拼入 SQL 後就正常,基本可判斷是「綁定參數 → 底層型別轉換」這一段出錯,而不是資料本身或 SQL 邏輯錯。

    1. 當錯誤訊息與實際問題不對應時,要懷疑型別或編碼
      arithmetic exception, numeric overflow, or string truncation 這類訊息在 Firebird/InterBase 裡相當籠統,可能是:

    數值超出欄位可表示範圍

    小數精度不符

    字串長度/編碼不符

    這次實際原因不是運算公式,而是「PHP 傳入的數值參數經 extension 轉換後,與資料庫定義不相容」。遇到類似錯誤時,除了檢查 SQL 邏輯,也要檢查:

    參數型別(int / float / string)

    資料庫欄位定義(numeric(precision, scale))

    是否有隱性 cast。

    1. 工具/函式介面行為改變,要用「最小不意外」原則繞過
      解法是「把數值變量直接嵌入 query 字串」,等於繞過 ibase_query 的數值參數型別轉換路徑,改為由資料庫自行解析字面值。

    聲明:本作品包含在人工智慧協助下產生的內容。作者已對所有材料進行驗證與編輯,以確保其準確性與完整性。

  • 在數據庫表格新增欄位,如何避免遺漏修改關於該表格的源代碼?

    分析:
    在數據庫表格新增欄位後,源代碼中所有引用該表格的 SQL 查詢、ORM 模型或業務邏輯可能未及時更新,導致運行時錯誤如「欄位不存在」或資料不一致。

    解法:
    新增欄位時先設預設值,避免 NULL 錯誤。
    修改 schema 後 grep 搜尋表格名,審核相關代碼

    教訓:
    Schema 變更必須視為程式碼變更的一部分,透過遷移工具與自動化強制同步,避免手動操作的盲點。

    聲明:本作品包含在人工智慧協助下產生的內容。作者已對所有材料進行驗證與編輯,以確保其準確性與完整性。

  • 在Excel中將整欄的數據加上固定字頭。

    問題:
    如何應用生成式AI解決這個問題?

    分析:
    生成式AI需要知道用戶使用哪個Spreadsheet軟件以及版本。

    解法:
    生成式AI先用一句話概括解決辦法,然後提供明確步驟,最後還提出其他相關方案(純觀看而不修改儲存格的內容)。只要跟著步驟做, 就能解決問題。

    教訓:
    生成式AI必須先詢問用戶使用的Spreadsheet軟件(如Excel、Google Sheets)和版本,因為不同工具的介面與函數略異,直接給步驟可能導致用戶困惑或操作失敗。

    聲明:本作品包含在人工智慧協助下產生的內容。作者已對所有材料進行驗證與編輯,以確保其準確性與完整性。

  • 從多個數據庫抽取數據, 放進Excel文件裡。

    問題:
    抽取回來的數據可能有重複, 需要去除重複的數據。生成式AI能否提供解決辦法?

    分析:
    生成式AI擅長理解文字內容, 亦擅長提供建議。

    解法:
    只需輸入清晰的指示和說明, 生成式AI便會提供一步一步的解決方法。

    教訓:
    工具愈聰明,人就愈要懂得下清楚指令。透過精準描述需求,我們不但能用 AI 找出和刪除 Excel 裡的重複數據,更能把枯燥的技術問題化成簡單可行的步驟。

    聲明:本作品包含在人工智慧協助下產生的內容。作者已對所有材料進行驗證與編輯,以確保其準確性與完整性。

  • 幫準客戶建立網頁, 用作查詢系統的資料

    問題:
    在準客戶的網頁不能連接到系統, 但在其他網站空間設置相同的網頁可以連接到系統。準客戶在外面聘請的IT人員私下提出解決方案, 提議我在準客戶的通訊群組提出。我應該怎樣做?

    分析:
    你不應該直接替外聘 IT 人員把他的「私下方案」在準客戶的群組中提出;你應先保持專業中立,讓方案正式、透明地進入準客戶的決策流程。

    為何不應直接代為提出
    這位 IT 人員並非你公司或你團隊的一部分,他的建議若由你「代為發聲」,容易被誤解為你 endorses(背書)或與他有利益關係,造成利益衝突印象。

    對客戶要「公平對待,並以客戶的最佳利益行事」,同時要避免和管理利益衝突;任何看似偏袒某一外部人士的行為,都有損你作為技術供應商的專業形象。

    專業操守一般要求:不要讓個人關係或可能獲得的好處,干擾到公司與客戶的整體利益與客觀判斷。

    解法:

    1. 私下回覆該 IT 人員

    感謝對方提出想法,但說明你必須按公司及專業操守行事,所有技術方案應由他自己或客戶正式提出,並進入正式討論/會議。

    表明你樂意在會議上就這個方案作技術評估,而不是替他「推銷」或代他發言。

    1. 向自己公司/上司報告

    簡短告知上司:準客戶有外聘 IT 顧問,顧問私下向你提方案,並希望你在客戶群組內提出。

    詢問公司是否有既定對策或需要由銷售/客戶經理統一對外溝通,確保你不是單獨承擔風險。

    1. 在準客戶那邊的正式溝通方式
      視乎你是否覺得方案在技術上有參考價值,可以有兩種處理方式,重點都是「透明」和「中立」:

    若方案有技術價值:

    在下一次正式會議或由客戶主導的渠道中,你可以說:「外部 IT 顧問有一些技術考慮,如果你們方便,可以請顧問在會議中直接說明,我們再一起討論可行性。」

    你只對技術合理性發表專業意見,不主動替方案「拉票」。

    若方案不成熟或你有保留:

    你可以只在內部(對自己公司)說明技術風險與顧慮,讓公司決定是否由業務/專案經理在適當時機與客戶溝通。

    避免在群組中突然拋出一個你自己都不完全認同、且來源不透明的建議。

    1. 釐清責任與邊界

    強調你作為系統工程師的角色,是提供客觀、完整的技術選項與風險評估,而不是幫任何一方「推方案」。

    在任何文件、會議紀錄中,把「誰提出何建議」寫清楚,例如:「此方案由客戶外聘 IT 顧問建議」,可避免日後責任不清。

    教訓:

    1. 利益衝突要「及早意識+保持距離」
      任何「私下游說你幫忙推某個方案」的情境,都要立刻當成潛在利益衝突看待,即使沒收錢也一樣。

    一旦你代某個外部人士發聲,客戶容易誤會你與他是同一陣線,這會損害你作為技術供應商應有的中立與公信力。

    1. 一切建議都要「來源透明」
      誰提出的方案,就應該由誰在正式場合說清楚,避免出現「你講、但來源是別人」的灰色地帶。

    在文件、會議中清楚標註「方案來源」和「你的專業評估」,可以在日後出現爭議時保護你和公司。

    1. 與客戶的信任要靠「長期、一致的專業行為」
      B2B 關係裡,客戶最在意的是你是否一貫站在他們整體利益和風險管理的角度,而不是幫某一個人「拉關係」或「推方案」。

    當你堅持讓討論走正式流程(會議、紀錄、清楚責任),反而會增加客戶對你專業與穩重的信任感。

    1. 發現灰色情況時,要「向上匯報,而不是獨自扛」
      遇到這類模糊、可能被解讀成利益衝突的情況,不要只靠自己判斷,應儘早向上司或公司相關主管匯報,讓組織一起承擔決定。

    很多誠信個案的教訓是:問題本身不大,但員工沒申報、沒求助,最後變成他個人獨自「頂曬」,風險反而放大。

    1. 溝通上要學會「拒絕,但給台階和替代方案」
      直接說「我唔幫你講」容易令關係僵硬;更成熟的做法是:禮貌拒絕代為提出,並同時邀請對方在正式會議由他親自說明,你只提供技術評估。

    這種說法既守住底線,又保留合作空間,是處理複雜利害關係時很實用的一個溝通模式。

    1. 把這類情況內化為「個人原則」
      你可以為自己列一條簡單原則:凡是涉及第三方私下叫我「代講、代推、代決定」的事,一律:先拒絕代言、再建議走正式流程、同時向上報備。這跟很多機構的誠信守則精神是一致的。

    日後只要遇到類似場景,就照這套原則走,可以減少臨場猶豫和壓力,也避免事後後悔。

    聲明:本作品包含在人工智慧協助下產生的內容。作者已對所有材料進行驗證與編輯,以確保其準確性與完整性。

  • 以SFTP自動傳送EDI文件, 接收方有時說收不到某個EDI文件, 即使重發了仍是收不到。

    分析:
    收不到EDI文件的可能原因:

    1. EDI文件沒有被生成。
    2. EDI文件沒有被傳送出去。
    3. EDI文件內容有錯誤, 導致接收方的系統不保存。

    解法:

    1. 保存一份已發送的EDI文件的副本, 有需要時可翻查。
    2. 重新傳送同一個EDI文件, 登入接收方的SFTP主機確認文件已順利傳送到達。

    教訓:
    在建立自動化的 SFTP 傳送流程時,必須確保每一個傳送步驟都有可追蹤與可驗證的紀錄。缺乏完善的日誌或檔案副本機制,容易導致問題難以追蹤,特別是當接收方聲稱「未收到」文件時,難以判斷問題發生在哪個環節。

    未來在設計類似系統時,應:

    為每次文件生成與傳送建立明確的記錄(包括文件名、時間戳記、傳送結果回報)。

    保存已傳送文件的副本,以便必要時進行比對與調查。

    在可能的情況下,實作接收確認機制(如回覆檔案或狀態回報),確保完整傳輸閉環。

    這樣不僅能提升問題排查的效率,也能強化系統間的信任與穩定性。

    本作品包含在人工智慧協助下產生的內容。作者已對所有材料進行驗證與編輯,以確保其準確性與完整性。

  • 不同物流系統進行對接, 發送方是由多個獨立的數據庫組成, 每個數據庫有自己的客戶代碼。接收方需要建立供應商/收貨人的唯一識別碼(ID), 要求發送方提供。

    分析:
    發送方不同數據庫是自行管理公司代碼, 所以代碼在同一數據庫內是唯一, 但在全部數據庫裡未必是唯一。更大的問題是同一個客戶在不同的數據庫可能有不同公司代碼。

    解法:

    1. 在公司代碼前面加上數據庫代號。
      好處: 簡單
      壞處: 如果同一個客戶出現在多個數據庫, 這個客戶會有多個不同的代碼, 所以代碼並不是唯一。
    2. 為每一個客戶編定唯一識別碼。
      好處: 可確定識別碼是唯一的。
      壞處: 可能會花很多時間去確保識別碼是唯一的。

    教訓:
    提早定義全域唯一識別規範
    在多資料來源系統對接前,應先決定唯一識別碼的生成與維護策略。若一開始依賴本地(資料庫內部)代碼作為主鍵,後續整合時幾乎必然出現衝突與對應問題。

    避免將內部業務代碼當作跨系統識別碼
    公司代碼、客戶代碼等通常是業務邏輯層概念,而非技術上保證唯一的 ID。它們可以保留作輔助欄位,但不應作為整合集成的關鍵識別依據。

    建立唯一識別碼需要統一管理機制
    若選擇集中式唯一 ID(例如 UUID、全域客戶 ID),需設立負責生成與維護唯一性的權威系統,避免人工重複核對的高成本。

    在整合設計中考慮真實業務意義對應
    即使技術上有唯一 ID,也要確認能正確反映「同一客戶」的業務實體。必要時應建立「客戶主檔」(Master Data Management, MDM)來處理跨系統實體的關聯與比對。

    短期方案應可平滑遷移至長期方案
    若初期時間有限,可採用臨時方案(如加資料庫代號前綴),但需為未來導入統一 ID 預留遷移機制,避免資料重構困難。

    聲明:本作品包含在人工智慧協助下產生的內容。作者已對所有材料進行驗證與編輯,以確保其準確性與完整性。

  • 在Windows 11 運行 Team Coherence (Version Control developed by Quality Software Component Ltd), Check-in file時, 會出現錯誤訊息: Error with Kernelbase.dll

    分析:
    嘗試過用combatibility mode運行, 還是出現相同的錯誤訊息。

    解法:

    1. 在較舊的Windows版本(如 Windows 10, 7)運行 (不建議, 因舊的Windows版本已沒有支援)
    2. 使用其他version control software, 如 Git, Subversion

    教訓:
    在使用舊版軟體(例如 Team Coherence)於新作業系統(如 Windows 11)時,可能會因系統相容性及舊程式庫依賴(例如 Kernelbase.dll)而導致錯誤。這提醒我們:
    要定期評估並更新開發工具,以避免因不再維護的軟體造成相容性問題。
    應盡早規劃遷移至現代化版本控制系統(如 Git 或 Subversion),確保工作流程穩定且能獲得持續支援。
    在導入或升級作業系統前,宜先驗證關鍵工具的相容性,預防影響開發效率。

    聲明:本作品包含在人工智慧協助下產生的內容。作者已對所有材料進行驗證與編輯,以確保其準確性與完整性。

  • 用AI寫程式實例

    寫一個程式從一個純文字的文件抽取客戶資料,生成Excel文件。這個純文字文件有固定寛度的欄位,但地址卻是跨欄位的。嘗試將文件截圖,加上標記,告訴AI根據截圖的說明來生成Excel 文件。結果……失敗了。地址被放進錯誤的欄位。我重新思考,用了另一個方法:將想要的結果給AI,即是需要生成的Excel 文件。這次AI給出像樣的程式代碼。

    用AI寫程式要注意:

    1. 去除敏感數據:尤其是使用的是公共AI。

    2. 找有經驗的程式員查看生成的程式代碼,並進行嚴格的測試。

  • 在Firebird (SQL) 運行 View 時出現錯誤訊息”arithmetic exception, numeric overflow, or string truncation”

    分析:

    1. Arithmetic Exception的最常見原因是算式出現除以0。
    2. Numeric overflow的原因是數值超出欄位的最大值。
    3. 字串過長。

    解法:

    1. 尋找除數算式, 可嘗試加入Check確保不會除以0。
    2. 確保數值不超過欄位的最大值。考慮使用最大值更大的data type。
    3. 擴大欄位的字串長度, 或者保存字串到欄位前先trunc到合適長度。
    4. Cast NULL to a Non-Nullable domain/type

    教訓:
    在 Firebird SQL 的 View 中,遇到「算術異常、數值溢出或字串截斷」錯誤時,通常源於資料計算或轉換過程中的邊界條件未妥善處理。

    聲明:本作品包含在人工智慧協助下產生的內容。作者已對所有材料進行驗證與編輯,以確保其準確性與完整性。