記與utf8mb4亂碼排查指南)
簡(jiǎn)介這是 Navicat 數(shù)據(jù)庫(kù)管理工具的解壓即用版本面向數(shù)據(jù)庫(kù)管理員、后端開(kāi)發(fā)者和需要在不同機(jī)器上快速搭建數(shù)據(jù)庫(kù)管理終端的使用者省去安裝配置流程。壓縮包內(nèi)共 122 個(gè)文件大小約 121.69MB文件構(gòu)成以動(dòng)態(tài)鏈接庫(kù)和可執(zhí)行程序?yàn)橹髌渲邪罅酷槍?duì)常見(jiàn)數(shù)據(jù)庫(kù)的驅(qū)動(dòng)組件如 Oracle、MySQL/MariaDB 的相關(guān)庫(kù)同時(shí)附有少量 PHP 輔助腳本、樣例數(shù)據(jù)庫(kù)、密鑰證書(shū)、說(shuō)明文檔以及表格文件可覆蓋工具啟動(dòng)、連接測(cè)試、查詢統(tǒng)計(jì)和導(dǎo)出等基本使用環(huán)節(jié)。目前已有 763 人下載學(xué)習(xí)適合作為個(gè)人或團(tuán)隊(duì)在開(kāi)發(fā)、測(cè)試、運(yùn)維場(chǎng)景中的綠色工具包。使用者解壓后直接啟動(dòng)即可連接數(shù)據(jù)庫(kù)進(jìn)行管理操作包內(nèi)樣例數(shù)據(jù)和文檔能幫助快速核對(duì)連接參數(shù)、熟悉功能界面也可在無(wú)網(wǎng)絡(luò)環(huán)境下作為便攜數(shù)據(jù)庫(kù)客戶端備用。1. 解壓即用版 Navicat先搞懂它和安裝版差在哪很多同學(xué)第一次接觸“Navicat 解壓即用版”是在公司電腦上——沒(méi)有管理員權(quán)限安裝包彈出來(lái)就要授權(quán)或者自己習(xí)慣的版本和同事對(duì)不上問(wèn)題復(fù)現(xiàn)不出來(lái)。解壓即用版解決的痛點(diǎn)很直接一個(gè)文件夾搞定數(shù)據(jù)庫(kù)客戶端換機(jī)器、換電腦、交給同事拷過(guò)去就能連庫(kù)不用重新裝、不用重新配連接。但要先說(shuō)破一件事Navicat 官方本來(lái)就支持“便攜模式”不是誰(shuí)拿安裝包改巴改巴做出個(gè)綠色版。它的原理是讓程序在啟動(dòng)時(shí)發(fā)現(xiàn)一個(gè)特定標(biāo)記文件從而把配置、連接、查詢記錄都寫(xiě)到程序自己所在的目錄而不是寫(xiě)到系統(tǒng)的注冊(cè)表和用戶目錄。理解了這一點(diǎn)你就能自己組裝、自己遷移、出了亂子也能自己修。這篇筆記就順著這個(gè)標(biāo)題把“解壓即用版”的做法、參數(shù)、亂碼問(wèn)題和踩坑記錄一次講完。2. 把安裝版改造成解壓即用版portable 標(biāo)記文件與數(shù)據(jù)目錄遷移2.1 便攜模式觸發(fā)機(jī)制一個(gè)無(wú)擴(kuò)展名的 portable 文件Navicat 的便攜模式不是靠第三方工具封裝出來(lái)的而是程序自帶的隱藏開(kāi)關(guān)。常見(jiàn)做法是在你已經(jīng)安裝好的 Navicat 主程序根目錄下放一個(gè)文件名是portable、沒(méi)有擴(kuò)展名、內(nèi)容為空的文件。Navicat 啟動(dòng)時(shí)如果檢測(cè)到這個(gè)文件存在就會(huì)把當(dāng)前安裝目錄當(dāng)作數(shù)據(jù)根目錄所有用戶配置不再寫(xiě)入注冊(cè)表也不再寫(xiě)入%APPDATA%\PremiumSoft\Navicat而是就地保存。這個(gè)設(shè)計(jì)本來(lái)是為了方便企業(yè)批量分發(fā)和 U 盤(pán)攜帶的結(jié)果正好成了“解壓即用版”的標(biāo)準(zhǔn)做法。用這個(gè)開(kāi)關(guān)的好處是干凈程序本身的文件和解壓后生成的數(shù)據(jù)文件都在同一個(gè)目錄里壓縮、拷貝、改名都跟著走不依賴系統(tǒng)環(huán)境。相比之下有些第三方綠色版會(huì)在首次運(yùn)行時(shí)悄悄寫(xiě)注冊(cè)表看著是免安裝實(shí)際重裝系統(tǒng)后照樣出問(wèn)題。需要說(shuō)明的是portable文件的位置必須和主程序 exe 放在同一級(jí)也就是說(shuō)它要放在 Navicat 的根目錄而不是 bin 目錄或者某個(gè)子目錄。放錯(cuò)位置程序就按普通安裝版跑配置還是寫(xiě)進(jìn)注冊(cè)表你會(huì)誤以為這個(gè)解壓包壞了。2.2 三步遷移復(fù)制安裝包、寫(xiě)入標(biāo)記、搬走用戶配置如果你手上已經(jīng)有安裝好的 Navicat想把它變成解壓即用版操作路徑就是三步。這里以 Windows 10 和 Navicat 16 為例其他版本路徑類似但注意根據(jù)實(shí)際安裝目錄替換。第一步找到安裝目錄并創(chuàng)建 portable 標(biāo)記文件。用 PowerShell 執(zhí)行下面這段$dmPath C:\Program Files\PremiumSoft\Navicat 16 New-Item -ItemType File -Path (Join-Path $dmPath portable) -Force這段腳本的作用是在 Navicat 根目錄下創(chuàng)建一個(gè)名為portable的空文件。-Force參數(shù)的意思是如果這個(gè)文件已經(jīng)存在直接復(fù)用而不報(bào)錯(cuò)。請(qǐng)注意文件名不能加.txt后綴也不能改成portable.ini必須是完整的portable。第二步把當(dāng)前用戶已存在的連接配置復(fù)制到程序目錄。Navicat 安裝在正常模式時(shí)連接信息和界面設(shè)置存放在用戶目錄下路徑一般是C:\Users\你的用戶名\AppData\Roaming\PremiumSoft\Navicat。執(zhí)行下面這段$dmPath C:\Program Files\PremiumSoft\Navicat 16 $srcPath Join-Path $env:APPDATA PremiumSoft\Navicat Copy-Item (Join-Path $srcPath *) $dmPath -Recurse -Force這里把舊配置整體復(fù)制到了安裝目錄目的就是讓便攜模式啟動(dòng)后能讀到這些連接。-Recurse是遞歸復(fù)制子目錄-Force覆蓋同名文件。如果你的舊電腦上從來(lái)沒(méi)連接過(guò)任何數(shù)據(jù)庫(kù)這個(gè)目錄可能根本不存在那就直接跳過(guò)這一步。第三步把整個(gè) Navicat 目錄壓縮打包然后拷貝到目標(biāo)機(jī)器解壓。這一步?jīng)]有特殊命令用系統(tǒng)自帶的壓縮功能或者命令行壓縮工具都可以。解壓后仍然保持目錄結(jié)構(gòu)完整雙擊navicat.exe就能啟動(dòng)。啟動(dòng)后去“連接”面板看原來(lái)配好的連接如果遷移成功就會(huì)原樣出現(xiàn)。2.3 解壓目錄里的配置文件清單哪些能刪哪些不能刪便攜模式跑起來(lái)之后Navicat 根目錄下會(huì)多出一些文件。下面這張表列了最常見(jiàn)的兩類實(shí)際版本可能有差異但思路一致。文件或目錄作用能不能刪portable便攜模式標(biāo)記文件不能刪刪了立刻變回安裝模式connections相關(guān)數(shù)據(jù)文件保存所有數(shù)據(jù)庫(kù)連接信息、SSH 隧道、SSL 證書(shū)路徑不能刪刪了連接全丟query歷史相關(guān)文件查詢編輯器里的歷史 SQL可以刪最多損失歷史記錄外觀/主題相關(guān)文件界面字體、顏色方案可以刪恢復(fù)默認(rèn)界面我一般把portable文件和連接數(shù)據(jù)文件單獨(dú)備份一份因?yàn)檫@兩個(gè)是“解壓即用”的核心。查詢歷史和外觀設(shè)置丟了不心疼連接信息丟了才是真的翻車(chē)。提示便攜模式切換后舊配置里的證書(shū)路徑、密鑰路徑如果寫(xiě)的是絕對(duì)路徑換機(jī)器后可能失效。SSL 證書(shū)、SSH 私鑰這類文件最好和 Navicat 目錄放在一起并在配置里用相對(duì)路徑或者重新指定。3. 解壓完成后必調(diào)的 5 個(gè)連接與顯示參數(shù)注釋亂碼從這個(gè)環(huán)節(jié)開(kāi)始3.1 連接屬性里的字符集UTF-8 還是 utf8mb4解壓即用版最容易出現(xiàn)的第一個(gè)問(wèn)題是亂碼而且很多亂碼并不是解壓包本身引起的是連接屬性里的字符集選錯(cuò)了。Navicat 建立連接時(shí)右鍵連接名選擇“編輯連接”在“高級(jí)”或“編碼”相關(guān)的標(biāo)簽頁(yè)里會(huì)有字符集選項(xiàng)。這里有一個(gè)很容易踩的坑選UTF-8和選utf8mb4不是一回事。MySQL 的utf8實(shí)際上是utf8mb3最多存 3 字節(jié)的字符遇到 emoji 表情和部分生僻字就會(huì)變問(wèn)號(hào)?,F(xiàn)在的 MySQL 5.5 以上版本推薦用utf8mb4。在命令行里驗(yàn)證當(dāng)前會(huì)話的字符集執(zhí)行下面這條 SQLSHOW VARIABLES LIKE character_set_client; SHOW VARIABLES LIKE character_set_results; SHOW VARIABLES LIKE character_set_connection;這三條分別查看客戶端發(fā)送的字符集、服務(wù)端返回結(jié)果的字符集、連接層的字符集。正常連 MySQL 8 時(shí)三者都應(yīng)該是utf8mb4。如果客戶端顯示是gbk或者latin1連接里的注釋、字段名、查詢結(jié)果都會(huì)亂。Navicat 連接屬性里選好字符集后程序在建立連接時(shí)就會(huì)自動(dòng)執(zhí)行對(duì)應(yīng)的SET NAMES語(yǔ)句。所以連接屬性里的編碼本質(zhì)上是在幫你做這件事不需要每次手動(dòng)敲命令。3.2 多主機(jī)切換解壓即用版換機(jī)器后怎么批量改 IP解壓即用版被帶到新環(huán)境后數(shù)據(jù)庫(kù)服務(wù)器地址往往要變。最保守的做法是刪掉連接重新建但如果連接有幾十個(gè)手工重建就是災(zāi)難。常見(jiàn)做法是直接改 Navicat 的連接數(shù)據(jù)文件用 PowerShell 做批量替換。$connsFile D:\DevTools\NavicatPortable\connections.json (Get-Content $connsFile -Raw -Encoding UTF8).Replace(10.0.0.1, 10.0.0.2) | Set-Content $connsFile -Encoding UTF8這段腳本先把連接文件內(nèi)容原樣讀出來(lái)把舊的 IP 替換成新 IP再以 UTF-8 編碼寫(xiě)回。替換前一定要先備份原文件因?yàn)檫B接文件里既有 IP 也有端口、用戶名、密鑰名稱替換字符串如果寫(xiě)得太寬泛容易誤傷其他配置。另外如果連接名是中文JSON 文件里的中文會(huì)被轉(zhuǎn)義成\uXXXX形式直接肉眼搜索中文是搜不到的搜索 IP 字符串反而安全。3.3 界面字體與編輯器字體Windows 10 下中文顯示不全的根源字符集配對(duì)了數(shù)據(jù)庫(kù)里的中文也正常返回但 Navicat 界面上注釋仍然顯示成方塊或者亂碼這就和數(shù)據(jù)庫(kù)沒(méi)關(guān)系了是字體渲染問(wèn)題。Navicat 的界面字體和編輯器字體是分開(kāi)設(shè)置的。打開(kāi)“工具”菜單下的“選項(xiàng)”在“字體”相關(guān)設(shè)置里界面字體選“微軟雅黑”編輯器字體如果選了純西文字體比如 Consolas中文注釋就會(huì)用后備字體渲染顯示效果不穩(wěn)定。Windows 10 環(huán)境下推薦把編輯器字體設(shè)為“Consolas 微軟雅黑”的組合或者在 Navicat 的字體下拉框里直接選“微軟雅黑”。注意表設(shè)計(jì)器里“注釋”這一欄的顯示字體走的是編輯器字體設(shè)置不是界面字體。很多人調(diào)了半天界面字體亂碼照舊就是因?yàn)槁┝诉@個(gè)位置。3.4 連接超時(shí)與自動(dòng)斷開(kāi)長(zhǎng)期掛機(jī)的隱形坑解壓即用版有個(gè)容易忽視的問(wèn)題如果 Navicat 放在 U 盤(pán)或者網(wǎng)絡(luò)驅(qū)動(dòng)器上連接會(huì)時(shí)不時(shí)卡住。這是因?yàn)橄到y(tǒng)對(duì)可移動(dòng)磁盤(pán)和網(wǎng)絡(luò)盤(pán)的讀寫(xiě)策略和本地磁盤(pán)不同休眠、拔盤(pán)、網(wǎng)絡(luò)閃斷都會(huì)導(dǎo)致進(jìn)程假死。Navicat 的“編輯連接 - 高級(jí)”里有連接超時(shí)、讀超時(shí)、寫(xiě)超時(shí)幾個(gè)參數(shù)長(zhǎng)時(shí)間掛機(jī)的場(chǎng)景下建議把讀超時(shí)和寫(xiě)超時(shí)從默認(rèn)值調(diào)大比如讀超時(shí) 60 秒寫(xiě)超時(shí) 60 秒。# 注意以下參數(shù)在 Navicat 圖形界面的“高級(jí)”標(biāo)簽頁(yè)里設(shè)置 # 連接超時(shí)30 秒 # 讀超時(shí)60 秒 # 寫(xiě)超時(shí)60 秒這個(gè)設(shè)置對(duì)本地 MySQL 影響不大但對(duì)云數(shù)據(jù)庫(kù)和跳板機(jī)后面的庫(kù)影響明顯。解壓即用版換了一臺(tái)網(wǎng)絡(luò)環(huán)境更差的機(jī)器默認(rèn)超時(shí)值可能直接導(dǎo)致導(dǎo)入大 SQL 時(shí)掉線。3.5 SSH 隧道與密鑰路徑遷移后第一個(gè)報(bào)錯(cuò)點(diǎn)如果連接走的是 SSH 隧道解壓即用版換機(jī)器后十有八九會(huì)報(bào)“找不到密鑰文件”。原因是密鑰在舊機(jī)器上的絕對(duì)路徑不存在了。我的做法是把私鑰文件直接放進(jìn) Navicat 目錄下的ssh文件夾連接配置里填相對(duì)路徑。這樣整個(gè)目錄打包走密鑰也跟著走。4. Windows 10 下 Navicat 注釋全是亂碼從數(shù)據(jù)庫(kù)到字體的完整排查4.1 先搞清楚亂碼發(fā)生在哪一段客戶端、傳輸層還是渲染層遇到“Windows 10 Navicat 注釋都是亂碼”這種問(wèn)題第一件事不是重新安裝而是判斷亂碼發(fā)生在哪個(gè)環(huán)節(jié)。按我的經(jīng)驗(yàn)鏈路是三層數(shù)據(jù)庫(kù)里存的中文本身對(duì)不對(duì)客戶端和數(shù)據(jù)庫(kù)之間的編碼協(xié)商對(duì)不對(duì)界面上字體渲染對(duì)不對(duì)。區(qū)分方法很簡(jiǎn)單在 Navicat 的查詢編輯器里執(zhí)行SELECT 中文測(cè)試 AS test;如果返回結(jié)果是正常中文說(shuō)明傳輸和客戶端解析沒(méi)問(wèn)題問(wèn)題只在字體渲染。如果返回結(jié)果就是亂碼說(shuō)明連接層編碼有問(wèn)題重點(diǎn)檢查連接屬性里的字符集。如果數(shù)據(jù)庫(kù)里存的字段本身是亂碼那是歷史數(shù)據(jù)問(wèn)題調(diào)整連接和字體都無(wú)能為力只能做數(shù)據(jù)清洗。我見(jiàn)過(guò)最誤導(dǎo)人的場(chǎng)景是表注釋在數(shù)據(jù)庫(kù)客戶端命令行里查是正常的在 Navicat 里顯示亂碼。這種情況幾乎都是字體或編碼設(shè)置問(wèn)題而不是數(shù)據(jù)庫(kù)本身的問(wèn)題。4.2 連接編碼統(tǒng)一SET NAMES 與連接屬性一一對(duì)應(yīng)連接層編碼問(wèn)題核心就是character_set_client、character_set_results、character_set_connection三個(gè)變量和數(shù)據(jù)庫(kù)實(shí)際存儲(chǔ)編碼不一致。執(zhí)行下面三條命令手動(dòng)把當(dāng)前會(huì)話的編碼統(tǒng)一到 utf8mb4SET NAMES utf8mb4; SHOW VARIABLES LIKE character_set_client; SHOW VARIABLES LIKE character_set_results; SHOW VARIABLES LIKE character_set_connection;SET NAMES utf8mb4相當(dāng)于一次把三個(gè)變量都改掉。第一個(gè)SHOW確認(rèn)客戶端發(fā)送編碼第二個(gè)確認(rèn)結(jié)果集返回編碼第三個(gè)確認(rèn)連接層編碼。如果三條結(jié)果都顯示utf8mb4傳輸層就通了。Navicat 連接屬性里的“編碼”下拉框本質(zhì)就是在啟動(dòng)連接時(shí)幫你執(zhí)行對(duì)應(yīng)的SET NAMES。選UTF-8在很多 MySQL 版本里對(duì)應(yīng)的是utf8mb3和utf8mb4有區(qū)別。如果你的數(shù)據(jù)庫(kù)里存了 emoji 或者生僻字連接屬性里要直接找utf8mb4找不到就手動(dòng)執(zhí)行SET NAMES。注意修改連接屬性里的編碼后已經(jīng)打開(kāi)的表窗口需要重新打開(kāi)一次才能生效。Navicat 對(duì)已打開(kāi)的窗口不會(huì)自動(dòng)刷新會(huì)話編碼這也是很多人改完設(shè)置以為沒(méi)用、實(shí)際是沒(méi)重開(kāi)窗口的原因。4.3 表和字段本身的字符集庫(kù)是 latin1客戶端再怎么設(shè)置也沒(méi)用連接層設(shè)置得再好數(shù)據(jù)庫(kù)表本身是latin1編碼中文一樣亂。這種情況多見(jiàn)于老系統(tǒng)遷過(guò)來(lái)的庫(kù)。排查語(yǔ)句如下SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_COLLATION FROM information_schema.TABLES WHERE TABLE_SCHEMA your_db;如果TABLE_COLLATION是latin1_swedish_ci或者gbk_chinese_ci而你要顯示中文就需要轉(zhuǎn)換表的字符集。轉(zhuǎn)換命令是ALTER TABLE your_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;這條命令會(huì)改表編碼同時(shí)嘗試把原有數(shù)據(jù)轉(zhuǎn)成新編碼。它有風(fēng)險(xiǎn)如果舊數(shù)據(jù)本身已經(jīng)被錯(cuò)誤地寫(xiě)成了亂碼字節(jié)轉(zhuǎn)變后亂碼依然存在甚至可能因?yàn)樽止?jié)轉(zhuǎn)換變得不可逆。執(zhí)行前先備份表導(dǎo)出數(shù)據(jù)和結(jié)構(gòu)。順便說(shuō)一句表設(shè)計(jì)中“注釋”的亂碼除了上面的原因還可能是因?yàn)閯?chuàng)建表時(shí)客戶端的character_set_client不是 utf8mb4導(dǎo)致注釋寫(xiě)進(jìn)去的時(shí)候就已經(jīng)是錯(cuò)碼。這類問(wèn)題只能重建注釋。4.4 Windows 10 系統(tǒng)區(qū)域設(shè)置最后一個(gè)容易被甩鍋的環(huán)節(jié)有些用戶會(huì)說(shuō)我連接編碼、字體都調(diào)了Navicat 其他中文都正常了但某些舊版 Navicat 的菜單或者彈窗還有小方塊。這個(gè)情況可能是 Windows 10 的非 Unicode 程序語(yǔ)言設(shè)置不對(duì)。系統(tǒng)設(shè)置里搜索“區(qū)域”進(jìn)入“更改系統(tǒng)區(qū)域設(shè)置”勾選“Beta使用 UTF-8 提供全球語(yǔ)言支持”重啟后部分歷史遺留問(wèn)題會(huì)消失。但說(shuō)實(shí)話Navicat 本身是 Unicode 程序這個(gè)選項(xiàng)對(duì)它的影響很有限。我通常把這一步當(dāng)作最后手段不優(yōu)先碰。動(dòng)了它會(huì)影響系統(tǒng)里所有非 Unicode 程序的默認(rèn)代碼頁(yè)屬于牽一發(fā)動(dòng)全身的操作。解壓即用版本來(lái)就是要降低環(huán)境依賴能不動(dòng)系統(tǒng)設(shè)置就不要?jiǎng)印?. 解壓即用版常見(jiàn)問(wèn)題避坑4 個(gè)真實(shí)翻車(chē)場(chǎng)景與實(shí)踐修復(fù)5.1 換了解壓目錄所有連接全部消失現(xiàn)象把 Navicat 解壓目錄從一個(gè)文件夾挪到另一個(gè)文件夾再打開(kāi)連接不在了界面回到初始狀態(tài)。原因便攜模式下Navicat 把數(shù)據(jù)根目錄綁定在程序所在目錄。直接移動(dòng)整個(gè)文件夾后如果中間經(jīng)過(guò)拷貝、改名或者移動(dòng)時(shí)只拖了 exe 沒(méi)帶數(shù)據(jù)文件程序會(huì)認(rèn)為自己首次運(yùn)行。解決先確認(rèn)portable標(biāo)記文件還在并且和數(shù)據(jù)文件在同一級(jí)目錄。如果只是換路徑把原目錄里的連接數(shù)據(jù)文件一并復(fù)制到新目錄即可。我的習(xí)慣是壓縮整個(gè) Navicat 目錄再解壓而不是單獨(dú)拖文件。文件夾改名、換盤(pán)符在 Windows 下容易觸發(fā)這類問(wèn)題。5.2 提示“應(yīng)用程序無(wú)法啟動(dòng)因?yàn)椴⑿信渲貌徽_”現(xiàn)象雙擊 navicat.exe 直接彈窗報(bào)并行配置錯(cuò)誤程序起不來(lái)。原因解壓即用版在目標(biāo)機(jī)器上缺少 VC 運(yùn)行庫(kù)。安裝版在安裝時(shí)會(huì)幫你裝好這些依賴解壓版不會(huì)主動(dòng)裝依賴缺失就直接報(bào)錯(cuò)。解決到目標(biāo)機(jī)器上安裝對(duì)應(yīng)版本的 VC 運(yùn)行庫(kù)常見(jiàn)做法是先裝vcredist_x64.exe裝完再啟動(dòng)。如果目標(biāo)機(jī)器是精簡(jiǎn)版系統(tǒng)可能還需要安裝 .NET Framework 基礎(chǔ)組件。這個(gè)坑在 Windows 10 LTSC 精簡(jiǎn)版系統(tǒng)上出現(xiàn)頻率特別高。5.3 MySQL 8 連接報(bào) Authentication plugin 錯(cuò)誤現(xiàn)象解壓即用版連接 MySQL 8報(bào)Authentication plugin caching_sha2_password cannot be loaded。原因MySQL 8 默認(rèn)認(rèn)證插件是caching_sha2_password但解壓包里這個(gè)版本的 Navicat 客戶端認(rèn)證庫(kù)不支持它。通常說(shuō)明你這個(gè)解壓包版本偏舊比如 Navicat 12 之前的版本對(duì) MySQL 8 支持不完整。解決兩個(gè)方向。要么升級(jí) Navicat 到新版要么臨時(shí)把 MySQL 賬號(hào)認(rèn)證方式改回老插件ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 你的密碼; FLUSH PRIVILEGES;改完再連就正常了。注意caching_sha2_password本身更安全改認(rèn)證插件只是權(quán)宜之計(jì)前提是這臺(tái) MySQL 在可信內(nèi)網(wǎng)環(huán)境。生產(chǎn)庫(kù)上做這個(gè)操作要謹(jǐn)慎最好先和 DBA 確認(rèn)。5.4 以前裝過(guò)正式版解壓即用版啟動(dòng)后還是讀舊配置現(xiàn)象解壓即用版啟動(dòng)后連接的還是以前正式版里的舊連接解壓目錄里改配置不起作用。原因portable標(biāo)記文件沒(méi)有生效程序仍然運(yùn)行在安裝模式下配置讀寫(xiě)走的是注冊(cè)表鍵和%APPDATA%路徑。最常見(jiàn)的原因是文件放錯(cuò)了層級(jí)或者文件帶上了隱藏屬性。解決打開(kāi)資源管理器確認(rèn)portable文件和navicat.exe在同一個(gè)目錄。如果之前正式版殘留了注冊(cè)表配置也沒(méi)關(guān)系標(biāo)記文件生效后程序會(huì)忽略注冊(cè)表??梢杂孟旅孢@條命令驗(yàn)證標(biāo)記文件是否真實(shí)存在且非目錄Get-Item D:\DevTools\NavicatPortable\portable | Select-Object FullName, Attributes如果輸出里沒(méi)有Directory屬性說(shuō)明它是一個(gè)普通文件程序能識(shí)別。6. 驗(yàn)證解壓即用版能否帶著走5 分鐘遷移檢查清單6.1 三張表比對(duì)清單文件、連接、編碼在把解壓目錄交給別人或者帶到另一臺(tái)電腦之前我每次都會(huì)花幾分鐘做一次系統(tǒng)檢查避免到現(xiàn)場(chǎng)才發(fā)現(xiàn)問(wèn)題。下面這張表是我自己的檢查清單檢查項(xiàng)位置通過(guò)條件portable 標(biāo)記文件Navicat 根目錄下存在且無(wú)擴(kuò)展名連接數(shù)據(jù)文件根目錄下和用戶目錄%APPDATA%\PremiumSoft\Navicat對(duì)比根目錄里有連接數(shù)據(jù)且不為空字符集配置連接屬性里的編碼目標(biāo) MySQL 是 utf8mb4 時(shí)選 utf8mb4字體設(shè)置工具-選項(xiàng)-字體界面字體是微軟雅黑SSH 密鑰文件Navicat 目錄內(nèi)私鑰文件存在且連接配置指向正確這個(gè)檢查的價(jià)值在于把“環(huán)境好不好”和“打包對(duì)不對(duì)”分開(kāi)看。到了客戶現(xiàn)場(chǎng)再排查亂碼、連接失敗會(huì)很被動(dòng)打包前檢查一遍能過(guò)濾掉八成問(wèn)題。6.2 用 PowerShell 校驗(yàn)遷移前后的配置一致性如果要換目錄或者確認(rèn)壓縮包內(nèi)容完整我習(xí)慣再用腳本做一次文件級(jí)校驗(yàn)。下面這個(gè)腳本會(huì)列出源目錄和目標(biāo)目錄之間缺失的文件以及大小不一致的文件$src C:\Temp\NavicatPortable $dst D:\DevTools\NavicatPortable Get-ChildItem $src -Recurse -File | ForEach-Object { $relPath $_.FullName.Substring($src.Length) $dstFile Join-Path $dst $relPath if (-not (Test-Path $dstFile)) { Write-Warning 目標(biāo)目錄缺少文件: $relPath } elseif ($_.Length -ne (Get-Item $dstFile).Length) { Write-Warning 文件大小不一致: $relPath } } Write-Host 校驗(yàn)完成這段腳本只比較文件名和大小不做內(nèi)容校驗(yàn)但對(duì)“漏拷文件”和“拷貝中斷”這類問(wèn)題足夠敏感。判斷核心是不是真“解壓即用”最終標(biāo)準(zhǔn)只有一個(gè)把解壓目錄拷貝到一臺(tái)沒(méi)有任何 Navicat 安裝記錄的機(jī)器上雙擊能啟動(dòng)連接能建表注釋是中文。我自己的習(xí)慣是隨身帶一個(gè) 16GB 的 U 盤(pán)里面放這個(gè)目錄和一份 vc_redist 運(yùn)行庫(kù)任何一臺(tái)機(jī)器拿過(guò)來(lái)都能在十分鐘內(nèi)進(jìn)入干活狀態(tài)。這套流程看著簡(jiǎn)單但每個(gè)細(xì)節(jié)都是踩坑踩出來(lái)的。尤其是portable標(biāo)記文件的位置和 utf8mb4 的選擇早期我在這兩個(gè)地方各翻過(guò)一次車(chē)后來(lái)固定成檢查清單里的必查項(xiàng)再?zèng)]出過(guò)問(wèn)題。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取