diff --git a/apps/desktop/src/components/connection/ConnectionDialog.vue b/apps/desktop/src/components/connection/ConnectionDialog.vue index 40cf0451b7..3bb10d01e3 100644 --- a/apps/desktop/src/components/connection/ConnectionDialog.vue +++ b/apps/desktop/src/components/connection/ConnectionDialog.vue @@ -3937,6 +3937,20 @@ const postgresClientKeyPath = computed({ form.value.url_params = setUrlParam(form.value.url_params, "sslkey", value); }, }); +// Firebird 的 Java 驱动(Jaybird)默认按 JVM 编码(UTF-8)解码 CHARACTER SET NONE +// 字段,历史数据若以 GBK 等编码存放就会显示为乱码。这里把连接字符集映射到 JDBC URL 的 +// charSet 参数(复用通用 URL 参数通道),交给用户按数据实际编码选择。 +const FIREBIRD_CHARSET_OPTIONS = ["UTF8", "GBK", "GB18030", "BIG5", "ISO8859_1", "Cp1252"]; +const firebirdCharsetItems = computed(() => { + const current = getUrlParam(form.value.url_params, "charSet"); + return current && !FIREBIRD_CHARSET_OPTIONS.includes(current) ? [current, ...FIREBIRD_CHARSET_OPTIONS] : FIREBIRD_CHARSET_OPTIONS; +}); +const firebirdCharset = computed({ + get: () => getUrlParam(form.value.url_params, "charSet") || "default", + set: (value: string) => { + form.value.url_params = setUrlParam(form.value.url_params, "charSet", value === "default" ? "" : value); + }, +}); const redisTlsInsecure = computed({ get: () => getUrlParam(form.value.url_params, "insecure").toLowerCase() === "true", set: (value: boolean) => { @@ -9349,6 +9363,24 @@ function openExternalUrl(url: string) { +
+ +
+ +

+ {{ t("connection.firebirdCharsetHint") }} +

+
+
+
@@ -9375,7 +9407,9 @@ function openExternalUrl(url: string) { ? 'localdatacenter=dc1' : form.db_type === 'transwarp' ? 'fetchSize=500;auth=noSasl' - : 'sslmode=prefer' + : form.db_type === 'firebird' + ? 'charSet=GBK' + : 'sslmode=prefer' " />

diff --git a/apps/desktop/src/i18n/locales/az.ts b/apps/desktop/src/i18n/locales/az.ts index be10fe04db..299ca1c49a 100644 --- a/apps/desktop/src/i18n/locales/az.ts +++ b/apps/desktop/src/i18n/locales/az.ts @@ -733,6 +733,8 @@ export default withEnglishFallback({ redisTlsInsecure: "Sertifikat yoxlamasını ötür", redisTlsInsecureHint: "Öz imzalı sertifikatlar və ya özəl CA-lar üçün redis-cli --tls --insecure əmrinə bərabərdir.", mysqlTlsMode: "TLS rejimi", + firebirdCharset: "Simvol dəsti", + firebirdCharsetHint: "CHARACTER SET NONE sütunlarında saxlanan mətni (məsələn, GBK ilə saxlanmış köhnə Çin məlumatları) deşifrə edir. Mətn pozulmuş görünürsə, məlumatın faktiki kodlaşdırmasını seçin.", mysqlTlsModePreferred: "Üstün tutulan", mysqlTlsModeDisabled: "Deaktiv", mysqlTlsModeRequired: "Tələb olunur", diff --git a/apps/desktop/src/i18n/locales/en.ts b/apps/desktop/src/i18n/locales/en.ts index afe148d379..729241df2d 100644 --- a/apps/desktop/src/i18n/locales/en.ts +++ b/apps/desktop/src/i18n/locales/en.ts @@ -1020,6 +1020,8 @@ export default { redisTlsInsecure: "Skip certificate verification", redisTlsInsecureHint: "Equivalent to redis-cli --tls --insecure, for self-signed certificates or private CAs.", mysqlTlsMode: "TLS Mode", + firebirdCharset: "Charset", + firebirdCharsetHint: "Decodes text stored in CHARACTER SET NONE columns (for example legacy Chinese data saved as GBK). Pick the actual data encoding when text appears garbled.", mysqlTlsModePreferred: "Preferred", mysqlTlsModeDisabled: "Disabled", mysqlTlsModeRequired: "Required", diff --git a/apps/desktop/src/i18n/locales/es.ts b/apps/desktop/src/i18n/locales/es.ts index 046a8b40ce..b52d19ae72 100644 --- a/apps/desktop/src/i18n/locales/es.ts +++ b/apps/desktop/src/i18n/locales/es.ts @@ -992,6 +992,8 @@ export default withEnglishFallback({ redisTlsInsecure: "Omitir verificación del certificado", redisTlsInsecureHint: "Equivale a redis-cli --tls --insecure, para certificados autofirmados o CA privadas.", mysqlTlsMode: "Modo TLS", + firebirdCharset: "Juego de caracteres", + firebirdCharsetHint: "Decodifica el texto almacenado en columnas CHARACTER SET NONE (por ejemplo, datos chinos antiguos guardados como GBK). Elige la codificación real de los datos cuando el texto aparezca mal.", mysqlTlsModePreferred: "Preferido", mysqlTlsModeDisabled: "Deshabilitado", mysqlTlsModeRequired: "Requerido", diff --git a/apps/desktop/src/i18n/locales/id.ts b/apps/desktop/src/i18n/locales/id.ts index 83a2e38a64..4f7ebbfaef 100644 --- a/apps/desktop/src/i18n/locales/id.ts +++ b/apps/desktop/src/i18n/locales/id.ts @@ -958,6 +958,8 @@ export default withEnglishFallback({ redisTlsInsecure: "Lewati verifikasi sertifikat", redisTlsInsecureHint: "Setara dengan redis-cli --tls --insecure, untuk sertifikat self-signed atau CA privat.", mysqlTlsMode: "Mode TLS", + firebirdCharset: "Charset", + firebirdCharsetHint: "Mendekode teks yang disimpan di kolom CHARACTER SET NONE (misalnya data bahasa Mandarin lama yang disimpan sebagai GBK). Pilih pengodean data yang sebenarnya saat teks tampak rusak.", mysqlTlsModePreferred: "Preferred", mysqlTlsModeDisabled: "Dinonaktifkan", mysqlTlsModeRequired: "Wajib", diff --git a/apps/desktop/src/i18n/locales/it.ts b/apps/desktop/src/i18n/locales/it.ts index 97ae2a6ad7..0cfba2fb1a 100644 --- a/apps/desktop/src/i18n/locales/it.ts +++ b/apps/desktop/src/i18n/locales/it.ts @@ -915,6 +915,8 @@ export default withEnglishFallback({ redisTlsInsecure: "Salta verifica certificato", redisTlsInsecureHint: "Equivalente a redis-cli --tls --insecure, per certificati auto-firmati o CA private.", mysqlTlsMode: "Modalità TLS", + firebirdCharset: "Set di caratteri", + firebirdCharsetHint: "Decodifica il testo memorizzato nelle colonne CHARACTER SET NONE (ad esempio dati cinesi legacy salvati come GBK). Scegli la codifica effettiva dei dati quando il testo appare illeggibile.", mysqlTlsModePreferred: "Preferita", mysqlTlsModeDisabled: "Disabilitata", mysqlTlsModeRequired: "Richiesta", diff --git a/apps/desktop/src/i18n/locales/ja.ts b/apps/desktop/src/i18n/locales/ja.ts index f198a44adf..be8acdc31f 100644 --- a/apps/desktop/src/i18n/locales/ja.ts +++ b/apps/desktop/src/i18n/locales/ja.ts @@ -915,6 +915,8 @@ export default withEnglishFallback({ redisTlsInsecure: "証明書の検証をスキップ", redisTlsInsecureHint: "自己署名証明書やプライベートCA用の、redis-cli --tls --insecure 相当の設定です。", mysqlTlsMode: "TLSモード", + firebirdCharset: "文字セット", + firebirdCharsetHint: "CHARACTER SET NONE の列に格納されたテキスト(例: GBK で保存された中国語の旧データ)をデコードします。文字化けする場合はデータの実際のエンコーディングを選択してください。", mysqlTlsModePreferred: "優先", mysqlTlsModeDisabled: "無効", mysqlTlsModeRequired: "必須", diff --git a/apps/desktop/src/i18n/locales/ko.ts b/apps/desktop/src/i18n/locales/ko.ts index cff83151ee..05ca95f731 100644 --- a/apps/desktop/src/i18n/locales/ko.ts +++ b/apps/desktop/src/i18n/locales/ko.ts @@ -950,6 +950,8 @@ export default withEnglishFallback({ redisTlsInsecure: "인증서 검증 건너뛰기", redisTlsInsecureHint: "redis-cli --tls --insecure과 동일하며, 자체 서명 인증서나 사설 CA용입니다.", mysqlTlsMode: "TLS 모드", + firebirdCharset: "문자 집합", + firebirdCharsetHint: "CHARACTER SET NONE 열에 저장된 텍스트(예: GBK로 저장된 예전 중국어 데이터)를 디코딩합니다. 텍스트가 깨져 보이면 데이터의 실제 인코딩을 선택하세요.", mysqlTlsModePreferred: "선호", mysqlTlsModeDisabled: "비활성화", mysqlTlsModeRequired: "필수", diff --git a/apps/desktop/src/i18n/locales/pt-BR.ts b/apps/desktop/src/i18n/locales/pt-BR.ts index 8aae7086d9..c7bdb0a7e4 100644 --- a/apps/desktop/src/i18n/locales/pt-BR.ts +++ b/apps/desktop/src/i18n/locales/pt-BR.ts @@ -916,6 +916,8 @@ export default withEnglishFallback({ redisTlsInsecure: "Ignorar verificação de certificado", redisTlsInsecureHint: "Equivalente a redis-cli --tls --insecure, para certificados autoassinados ou CAs privadas.", mysqlTlsMode: "Modo TLS", + firebirdCharset: "Conjunto de caracteres", + firebirdCharsetHint: "Decodifica textos armazenados em colunas CHARACTER SET NONE (por exemplo, dados em chinês antigos salvos como GBK). Escolha a codificação real dos dados quando o texto aparecer corrompido.", mysqlTlsModePreferred: "Preferencial", mysqlTlsModeDisabled: "Desabilitado", mysqlTlsModeRequired: "Obrigatório", diff --git a/apps/desktop/src/i18n/locales/ru.ts b/apps/desktop/src/i18n/locales/ru.ts index 4e2c064ba7..c7d009b254 100644 --- a/apps/desktop/src/i18n/locales/ru.ts +++ b/apps/desktop/src/i18n/locales/ru.ts @@ -931,6 +931,8 @@ export default withEnglishFallback({ redisTlsInsecure: "Пропускать проверку сертификата", redisTlsInsecureHint: "Эквивалентно redis-cli --tls --insecure, для самоподписанных сертификатов или частных CA.", mysqlTlsMode: "Режим TLS", + firebirdCharset: "Кодировка", + firebirdCharsetHint: "Декодирует текст в столбцах CHARACTER SET NONE (например, старые китайские данные в кодировке GBK). Если текст отображается некорректно, выберите фактическую кодировку данных.", mysqlTlsModePreferred: "Предпочтительный", mysqlTlsModeDisabled: "Отключено", mysqlTlsModeRequired: "Обязательный", diff --git a/apps/desktop/src/i18n/locales/tr.ts b/apps/desktop/src/i18n/locales/tr.ts index 44e7fc139c..952f6efa9a 100644 --- a/apps/desktop/src/i18n/locales/tr.ts +++ b/apps/desktop/src/i18n/locales/tr.ts @@ -733,6 +733,8 @@ export default withEnglishFallback({ redisTlsInsecure: "Sertifika doğrulamasını atla", redisTlsInsecureHint: "redis-cli --tls --insecure ile eşdeğerdir; kendinden imzalı sertifikalar veya özel CA'lar içindir.", mysqlTlsMode: "TLS Modu", + firebirdCharset: "Karakter kümesi", + firebirdCharsetHint: "CHARACTER SET NONE sütunlarında saklanan metni çözer (örneğin GBK olarak kaydedilmiş eski Çince veriler). Metin bozuk göründüğünde verinin gerçek kodlamasını seçin.", mysqlTlsModePreferred: "Tercih edilen", mysqlTlsModeDisabled: "Devre dışı", mysqlTlsModeRequired: "Zorunlu", diff --git a/apps/desktop/src/i18n/locales/zh-CN.ts b/apps/desktop/src/i18n/locales/zh-CN.ts index 6a0d135434..aa6651c421 100644 --- a/apps/desktop/src/i18n/locales/zh-CN.ts +++ b/apps/desktop/src/i18n/locales/zh-CN.ts @@ -956,6 +956,8 @@ export default withEnglishFallback({ redisTlsInsecure: "跳过证书验证", redisTlsInsecureHint: "等价于 redis-cli --tls --insecure,适用于自签名证书或私有 CA。", mysqlTlsMode: "TLS 模式", + firebirdCharset: "连接字符集", + firebirdCharsetHint: "用于解码 CHARACTER SET NONE 字段中的文本(例如旧库以 GBK 存放的中文)。文本出现乱码时,请按数据的实际编码选择。", mysqlTlsModePreferred: "优先使用", mysqlTlsModeDisabled: "禁用", mysqlTlsModeRequired: "必须使用", diff --git a/apps/desktop/src/i18n/locales/zh-TW.ts b/apps/desktop/src/i18n/locales/zh-TW.ts index f9a0b60daf..29fd54c473 100644 --- a/apps/desktop/src/i18n/locales/zh-TW.ts +++ b/apps/desktop/src/i18n/locales/zh-TW.ts @@ -920,6 +920,8 @@ export default withEnglishFallback({ redisTlsInsecure: "跳過憑證驗證", redisTlsInsecureHint: "等價於 redis-cli --tls --insecure,適用於自簽名憑證或私有 CA。", mysqlTlsMode: "TLS 模式", + firebirdCharset: "連線字元集", + firebirdCharsetHint: "用於解碼 CHARACTER SET NONE 欄位中的文字(例如舊資料庫以 GBK 儲存的中文)。文字出現亂碼時,請依資料的實際編碼選擇。", mysqlTlsModePreferred: "優先使用", mysqlTlsModeDisabled: "停用", mysqlTlsModeRequired: "必須使用", diff --git a/docs/screenshots/issue-4594-after.jpg b/docs/screenshots/issue-4594-after.jpg new file mode 100644 index 0000000000..60631fc087 Binary files /dev/null and b/docs/screenshots/issue-4594-after.jpg differ diff --git a/docs/screenshots/issue-4594-before.jpg b/docs/screenshots/issue-4594-before.jpg new file mode 100644 index 0000000000..c94b4269c8 Binary files /dev/null and b/docs/screenshots/issue-4594-before.jpg differ diff --git a/docs/screenshots/issue-4594-charset-menu.jpg b/docs/screenshots/issue-4594-charset-menu.jpg new file mode 100644 index 0000000000..7c013f2e30 Binary files /dev/null and b/docs/screenshots/issue-4594-charset-menu.jpg differ diff --git a/docs/screenshots/issue-4594-dialog.jpg b/docs/screenshots/issue-4594-dialog.jpg new file mode 100644 index 0000000000..c411fba562 Binary files /dev/null and b/docs/screenshots/issue-4594-dialog.jpg differ