mirror of
https://github.com/t8y2/dbx.git
synced 2026-10-19 16:16:45 +00:00
fix(firebird): decode legacy GBK text stored via ISO8859_1 connections
Closes #11220
This commit is contained in:
@@ -1,16 +1,84 @@
|
||||
package com.dbx.agent.firebird;
|
||||
|
||||
import com.dbx.agent.ColumnInfo;
|
||||
import com.dbx.agent.ConfiguredJdbcAgent;
|
||||
import com.dbx.agent.ConnectParams;
|
||||
import com.dbx.agent.JdbcAgentProfile;
|
||||
import com.dbx.agent.MetadataListConstraints;
|
||||
import com.dbx.agent.MultiSessionJsonRpcServer;
|
||||
import com.dbx.agent.ObjectInfo;
|
||||
import com.dbx.agent.ObjectSource;
|
||||
import com.dbx.agent.TableInfo;
|
||||
import java.nio.charset.Charset;
|
||||
import java.sql.Connection;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.Types;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
public final class FirebirdAgent extends ConfiguredJdbcAgent {
|
||||
private Charset dataCharset;
|
||||
|
||||
@Override
|
||||
protected String buildJdbcUrl(ConnectParams params) {
|
||||
String url = super.buildJdbcUrl(params);
|
||||
LegacyTextDecoder.charsetFromUrl(url); // Fail invalid configuration before opening a connection.
|
||||
return LegacyTextDecoder.jdbcUrl(url);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void afterConnect(ConnectParams params, Connection connection) {
|
||||
super.afterConnect(params, connection);
|
||||
dataCharset = LegacyTextDecoder.charsetFromUrl(super.buildJdbcUrl(params));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Object resultValue(ResultSet resultSet, int index, int sqlType) {
|
||||
Object value = super.resultValue(resultSet, index, sqlType);
|
||||
return switch (sqlType) {
|
||||
case Types.CHAR, Types.VARCHAR, Types.LONGVARCHAR,
|
||||
Types.NCHAR, Types.NVARCHAR, Types.LONGNVARCHAR, Types.CLOB, Types.NCLOB ->
|
||||
value instanceof String text ? decodeLegacyText(text) : value;
|
||||
default -> value;
|
||||
};
|
||||
}
|
||||
|
||||
private String decodeLegacyText(String value) {
|
||||
return LegacyTextDecoder.decode(value, dataCharset);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ColumnInfo> getColumns(String schema, String table) {
|
||||
List<ColumnInfo> columns = super.getColumns(schema, table);
|
||||
for (ColumnInfo column : columns) column.setComment(decodeLegacyText(column.getComment()));
|
||||
return columns;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<TableInfo> listTables(String schema) {
|
||||
return listTables(schema, MetadataListConstraints.NONE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<TableInfo> listTables(String schema, MetadataListConstraints constraints) {
|
||||
List<TableInfo> tables = super.listTables(schema, constraints);
|
||||
for (TableInfo table : tables) table.setComment(decodeLegacyText(table.getComment()));
|
||||
return tables;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ObjectInfo> listObjects(String schema) {
|
||||
return listObjects(schema, MetadataListConstraints.NONE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ObjectInfo> listObjects(String schema, MetadataListConstraints constraints) {
|
||||
List<ObjectInfo> objects = super.listObjects(schema, constraints);
|
||||
for (ObjectInfo object : objects) object.setComment(decodeLegacyText(object.getComment()));
|
||||
return objects;
|
||||
}
|
||||
static final String PROCEDURE_SOURCE_SQL = """
|
||||
SELECT
|
||||
CASE WHEN METADATA_ROW = 1 THEN PROCEDURE_SOURCE ELSE NULL END AS PROCEDURE_SOURCE,
|
||||
@@ -81,7 +149,7 @@ public final class FirebirdAgent extends ConfiguredJdbcAgent {
|
||||
while (resultSet.next()) {
|
||||
found = true;
|
||||
if (body == null) {
|
||||
body = resultSet.getString("PROCEDURE_SOURCE");
|
||||
body = decodeLegacyText(resultSet.getString("PROCEDURE_SOURCE"));
|
||||
}
|
||||
String parameterName = trimToNull(resultSet.getString("PARAMETER_NAME"));
|
||||
if (parameterName == null) {
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
package com.dbx.agent.firebird;
|
||||
|
||||
import java.net.URLDecoder;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.charset.CharacterCodingException;
|
||||
import java.nio.charset.Charset;
|
||||
import java.nio.charset.CodingErrorAction;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
/** Explicit, read-only recovery of legacy text stored as Latin-1 byte containers. */
|
||||
final class LegacyTextDecoder {
|
||||
static Charset charsetFromUrl(String url) {
|
||||
int query = url.indexOf('?');
|
||||
String charset = null;
|
||||
if (query >= 0) {
|
||||
for (String parameter : url.substring(query + 1).split("[&;]")) {
|
||||
String[] pair = parameter.split("=", 2);
|
||||
if (URLDecoder.decode(pair[0], StandardCharsets.UTF_8).equalsIgnoreCase("dataCharset")) {
|
||||
charset = pair.length == 2 ? URLDecoder.decode(pair[1], StandardCharsets.UTF_8).trim() : "";
|
||||
}
|
||||
}
|
||||
}
|
||||
return charset == null || charset.isEmpty() ? null : Charset.forName(charset);
|
||||
}
|
||||
|
||||
static String jdbcUrl(String url) {
|
||||
int query = url.indexOf('?');
|
||||
if (query < 0) return url;
|
||||
java.util.List<String> parameters = new java.util.ArrayList<>();
|
||||
boolean removed = false;
|
||||
for (String parameter : url.substring(query + 1).split("[&;]")) {
|
||||
String key = URLDecoder.decode(parameter.split("=", 2)[0], StandardCharsets.UTF_8);
|
||||
if (key.equalsIgnoreCase("dataCharset")) removed = true;
|
||||
else if (!parameter.isEmpty()) parameters.add(parameter);
|
||||
}
|
||||
if (!removed) return url;
|
||||
return url.substring(0, query) + (parameters.isEmpty() ? "" : "?" + String.join("&", parameters));
|
||||
}
|
||||
|
||||
static String decode(String value, Charset charset) {
|
||||
if (value == null || charset == null) return value;
|
||||
boolean highByte = false;
|
||||
for (int i = 0; i < value.length(); i++) {
|
||||
char character = value.charAt(i);
|
||||
// Never truncate Unicode characters or replacement characters into bytes.
|
||||
if (character > 255) return value;
|
||||
highByte |= character > 127;
|
||||
}
|
||||
if (!highByte) return value;
|
||||
try {
|
||||
return charset.newDecoder()
|
||||
.onMalformedInput(CodingErrorAction.REPORT)
|
||||
.onUnmappableCharacter(CodingErrorAction.REPORT)
|
||||
.decode(ByteBuffer.wrap(value.getBytes(StandardCharsets.ISO_8859_1))).toString();
|
||||
} catch (CharacterCodingException ignored) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
}
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
package com.dbx.agent.firebird;
|
||||
|
||||
import java.nio.charset.Charset;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
class LegacyTextDecoderTest {
|
||||
private static final Charset GBK = Charset.forName("GBK");
|
||||
|
||||
@Test
|
||||
void recoversUserTestRowAndColumnComments() {
|
||||
assertEquals("草稿", LegacyTextDecoder.decode("²Ý¸å", GBK));
|
||||
assertEquals("明细状态", LegacyTextDecoder.decode("Ã÷ϸ״̬", GBK));
|
||||
assertEquals("子流水", LegacyTextDecoder.decode("×ÓÁ÷Ë®", GBK));
|
||||
}
|
||||
|
||||
@Test
|
||||
void preservesDefaultUnicodeAsciiNullAndMalformedData() {
|
||||
assertEquals("²Ý¸å", LegacyTextDecoder.decode("²Ý¸å", null));
|
||||
assertEquals("中文😀", LegacyTextDecoder.decode("中文😀", GBK));
|
||||
assertEquals("bad�", LegacyTextDecoder.decode("bad�", GBK));
|
||||
assertEquals("id", LegacyTextDecoder.decode("id", GBK));
|
||||
assertNull(LegacyTextDecoder.decode(null, GBK));
|
||||
assertEquals("é", LegacyTextDecoder.decode("é", GBK)); // Incomplete GBK sequence.
|
||||
}
|
||||
|
||||
@Test
|
||||
void supportsExplicitBig5AndGb18030() {
|
||||
for (String name : new String[] {"Big5", "GB18030"}) {
|
||||
Charset charset = Charset.forName(name);
|
||||
String latin1 = new String("中文".getBytes(charset), StandardCharsets.ISO_8859_1);
|
||||
assertEquals("中文", LegacyTextDecoder.decode(latin1, charset));
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
void separatesDbxReadOptionFromJdbcPropertiesIncludingFullUrls() {
|
||||
String url = "jdbc:firebirdsql://localhost:3050/C:/test.fdb?charSet=ISO8859_1&dataCharset=GBK&sqlDialect=3";
|
||||
assertEquals(GBK, LegacyTextDecoder.charsetFromUrl(url));
|
||||
assertEquals("jdbc:firebirdsql://localhost:3050/C:/test.fdb?charSet=ISO8859_1&sqlDialect=3", LegacyTextDecoder.jdbcUrl(url));
|
||||
assertEquals(GBK, LegacyTextDecoder.charsetFromUrl("jdbc:firebirdsql:x?DATACHARSET=%47%42%4b"));
|
||||
assertEquals("jdbc:firebirdsql:x", LegacyTextDecoder.jdbcUrl("jdbc:firebirdsql:x?dataCharset=GBK"));
|
||||
assertNull(LegacyTextDecoder.charsetFromUrl("jdbc:firebirdsql:x?dataCharset="));
|
||||
assertEquals("jdbc:firebirdsql:x?charSet=GBK;sqlDialect=3", LegacyTextDecoder.jdbcUrl("jdbc:firebirdsql:x?charSet=GBK;sqlDialect=3"));
|
||||
assertThrows(IllegalArgumentException.class, () -> LegacyTextDecoder.charsetFromUrl("jdbc:firebirdsql:x?dataCharset=not-a-charset"));
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,7 @@ cassandra-go shared-fallback native-go Uses cassandra-gocql-driver schema metada
|
||||
dameng native-pushdown java-sql Uses ALL_OBJECTS with type, filter, stable order, and LIMIT/OFFSET with legacy fallback.
|
||||
databend native-pushdown java-sql Uses system procedures for routine pushdown and shared table metadata constraints for table-like objects.
|
||||
db2 native-pushdown java-sql Uses SYSCAT metadata with type, filter, stable order, and OFFSET/FETCH.
|
||||
firebird shared-fallback java-jdbc-metadata Delegates constrained listings to shared JDBC metadata and only applies explicitly configured legacy text decoding to comments.
|
||||
gbase8a native-pushdown java-sql Uses information_schema with type, filter, stable order, and LIMIT/OFFSET.
|
||||
gbase8s native-pushdown java-sql Uses systables with type, filter, stable order, and SKIP/FIRST.
|
||||
goldendb native-pushdown java-sql Uses information_schema with type, filter, stable order, and LIMIT/OFFSET.
|
||||
|
||||
|
@@ -3958,6 +3958,17 @@ const firebirdCharset = computed({
|
||||
form.value.url_params = setUrlParam(form.value.url_params, "charSet", value === "default" ? "" : value);
|
||||
},
|
||||
});
|
||||
const FIREBIRD_DATA_CHARSET_OPTIONS = ["GBK", "GB18030", "BIG5"];
|
||||
const firebirdDataCharsetItems = computed(() => {
|
||||
const current = getUrlParam(form.value.url_params, "dataCharset");
|
||||
return current && !FIREBIRD_DATA_CHARSET_OPTIONS.includes(current) ? [current, ...FIREBIRD_DATA_CHARSET_OPTIONS] : FIREBIRD_DATA_CHARSET_OPTIONS;
|
||||
});
|
||||
const firebirdDataCharset = computed({
|
||||
get: () => getUrlParam(form.value.url_params, "dataCharset") || "default",
|
||||
set: (value: string) => {
|
||||
form.value.url_params = setUrlParam(form.value.url_params, "dataCharset", value === "default" ? "" : value);
|
||||
},
|
||||
});
|
||||
const redisTlsInsecure = computed({
|
||||
get: () => getUrlParam(form.value.url_params, "insecure").toLowerCase() === "true",
|
||||
set: (value: boolean) => {
|
||||
@@ -9398,6 +9409,20 @@ function openExternalUrl(url: string) {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div v-if="form.db_type === 'firebird'" class="grid grid-cols-4 items-start gap-4">
|
||||
<Label :class="connectionLabelTopClass">{{ t("connection.firebirdDataCharset") }}</Label>
|
||||
<div class="col-span-3 space-y-1.5">
|
||||
<Select v-model="firebirdDataCharset">
|
||||
<SelectTrigger class="h-9"><SelectValue /></SelectTrigger>
|
||||
<SelectContent>
|
||||
<SelectItem value="default">{{ t("common.default") }}</SelectItem>
|
||||
<SelectItem v-for="charset in firebirdDataCharsetItems" :key="charset" :value="charset">{{ charset }}</SelectItem>
|
||||
</SelectContent>
|
||||
</Select>
|
||||
<p class="text-xs leading-5 text-muted-foreground">{{ t("connection.firebirdDataCharsetHint") }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div v-if="supportsGenericUrlParams" class="connection-url-params-row grid grid-cols-4 items-start gap-4" :class="{ 'connection-url-params-row--compact': !showGenericUrlParamsHint, 'connection-url-params-row--with-hint': showGenericUrlParamsHint }">
|
||||
<Label :class="[connectionLabelClass, 'connection-url-params-label']">{{ t("connection.urlParams") }}</Label>
|
||||
<div class="col-span-3 space-y-1.5">
|
||||
|
||||
@@ -752,7 +752,9 @@ export default withEnglishFallback({
|
||||
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.",
|
||||
firebirdCharsetHint: "Bağlantı simvol dəstini və CHARACTER SET NONE sahələrinin dekodlaşdırılmasını idarə edir. ISO8859_1 sahələrində saxlanmış GBK və ya digər köhnə məlumatlar üçün oxuma kodlaşdırmasını da təyin edin.",
|
||||
firebirdDataCharset: "Köhnə məlumatların oxuma kodlaşdırması",
|
||||
firebirdDataCharsetHint: "ISO8859_1 kimi elan edilmiş, lakin GBK və ya başqa kodlaşdırmada saxlanmış sahələr üçün. Bağlantı simvol dəsti kimi ISO8859_1 seçin. Yalnız mətn və şərhlərin oxunmasına təsir edir; yazma bağlantı simvol dəstindən istifadə edir.",
|
||||
mysqlTlsModePreferred: "Üstün tutulan",
|
||||
mysqlTlsModeDisabled: "Deaktiv",
|
||||
mysqlTlsModeRequired: "Tələb olunur",
|
||||
|
||||
@@ -1066,7 +1066,9 @@ export default {
|
||||
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.",
|
||||
firebirdCharsetHint: "Controls the connection charset and decoding of CHARACTER SET NONE fields. For GBK or other legacy data stored in ISO8859_1 fields, also set Legacy read encoding.",
|
||||
firebirdDataCharset: "Legacy read encoding",
|
||||
firebirdDataCharsetHint: "For fields declared as ISO8859_1 but stored as GBK or another encoding. Select ISO8859_1 as the connection charset. Only affects reading text and comments; writes still use the connection charset.",
|
||||
mysqlTlsModePreferred: "Preferred",
|
||||
mysqlTlsModeDisabled: "Disabled",
|
||||
mysqlTlsModeRequired: "Required",
|
||||
|
||||
@@ -1038,7 +1038,9 @@ export default withEnglishFallback({
|
||||
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.",
|
||||
firebirdCharsetHint: "Controla el juego de caracteres de conexión y la decodificación de campos CHARACTER SET NONE. Para datos GBK u otros datos heredados en campos ISO8859_1, configure también la codificación de lectura heredada.",
|
||||
firebirdDataCharset: "Codificación de lectura heredada",
|
||||
firebirdDataCharsetHint: "Para campos declarados como ISO8859_1 pero guardados como GBK u otra codificación. Seleccione ISO8859_1 como juego de caracteres de conexión. Solo afecta a la lectura de texto y comentarios; las escrituras usan el juego de caracteres de conexión.",
|
||||
mysqlTlsModePreferred: "Preferido",
|
||||
mysqlTlsModeDisabled: "Deshabilitado",
|
||||
mysqlTlsModeRequired: "Requerido",
|
||||
|
||||
@@ -982,7 +982,9 @@ export default withEnglishFallback({
|
||||
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.",
|
||||
firebirdCharsetHint: "Mengatur charset koneksi dan decoding kolom CHARACTER SET NONE. Untuk data lama GBK atau encoding lain dalam kolom ISO8859_1, atur juga encoding baca data lama.",
|
||||
firebirdDataCharset: "Encoding baca data lama",
|
||||
firebirdDataCharsetHint: "Untuk kolom yang dinyatakan ISO8859_1 tetapi disimpan sebagai GBK atau encoding lain. Pilih ISO8859_1 sebagai charset koneksi. Hanya memengaruhi pembacaan teks dan komentar; penulisan tetap memakai charset koneksi.",
|
||||
mysqlTlsModePreferred: "Preferred",
|
||||
mysqlTlsModeDisabled: "Dinonaktifkan",
|
||||
mysqlTlsModeRequired: "Wajib",
|
||||
|
||||
@@ -961,7 +961,9 @@ export default withEnglishFallback({
|
||||
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.",
|
||||
firebirdCharsetHint: "Controlla il set di caratteri della connessione e la decodifica dei campi CHARACTER SET NONE. Per dati legacy GBK o di altra codifica in campi ISO8859_1, impostare anche la codifica di lettura dei dati legacy.",
|
||||
firebirdDataCharset: "Codifica di lettura dei dati legacy",
|
||||
firebirdDataCharsetHint: "Per campi dichiarati ISO8859_1 ma salvati come GBK o con un’altra codifica. Selezionare ISO8859_1 come set di caratteri della connessione. Influisce solo sulla lettura di testo e commenti; le scritture usano il set di caratteri della connessione.",
|
||||
mysqlTlsModePreferred: "Preferita",
|
||||
mysqlTlsModeDisabled: "Disabilitata",
|
||||
mysqlTlsModeRequired: "Richiesta",
|
||||
|
||||
@@ -961,7 +961,9 @@ export default withEnglishFallback({
|
||||
redisTlsInsecureHint: "自己署名証明書やプライベートCA用の、redis-cli --tls --insecure 相当の設定です。",
|
||||
mysqlTlsMode: "TLSモード",
|
||||
firebirdCharset: "文字セット",
|
||||
firebirdCharsetHint: "CHARACTER SET NONE の列に格納されたテキスト(例: GBK で保存された中国語の旧データ)をデコードします。文字化けする場合はデータの実際のエンコーディングを選択してください。",
|
||||
firebirdCharsetHint: "接続文字セットと CHARACTER SET NONE 列のデコードを設定します。ISO8859_1 列に GBK などで保存された旧データには、旧データの読み取り文字コードも設定してください。",
|
||||
firebirdDataCharset: "旧データの読み取り文字コード",
|
||||
firebirdDataCharsetHint: "ISO8859_1 と宣言され、実際には GBK などで保存された列に使用します。接続文字セットは ISO8859_1 を選択してください。テキストとコメントの読み取りのみ対象です。書き込みは接続文字セットを使用します。",
|
||||
mysqlTlsModePreferred: "優先",
|
||||
mysqlTlsModeDisabled: "無効",
|
||||
mysqlTlsModeRequired: "必須",
|
||||
|
||||
@@ -996,7 +996,9 @@ export default withEnglishFallback({
|
||||
redisTlsInsecureHint: "redis-cli --tls --insecure과 동일하며, 자체 서명 인증서나 사설 CA용입니다.",
|
||||
mysqlTlsMode: "TLS 모드",
|
||||
firebirdCharset: "문자 집합",
|
||||
firebirdCharsetHint: "CHARACTER SET NONE 열에 저장된 텍스트(예: GBK로 저장된 예전 중국어 데이터)를 디코딩합니다. 텍스트가 깨져 보이면 데이터의 실제 인코딩을 선택하세요.",
|
||||
firebirdCharsetHint: "연결 문자 집합과 CHARACTER SET NONE 필드의 디코딩을 설정합니다. ISO8859_1 필드에 GBK 등으로 저장된 기존 데이터는 읽기 인코딩도 설정하세요.",
|
||||
firebirdDataCharset: "기존 데이터 읽기 인코딩",
|
||||
firebirdDataCharsetHint: "ISO8859_1로 선언되었지만 GBK 등으로 저장된 필드에 사용합니다. 연결 문자 집합은 ISO8859_1을 선택하세요. 텍스트와 주석 읽기에만 적용되며 쓰기는 연결 문자 집합을 사용합니다.",
|
||||
mysqlTlsModePreferred: "선호",
|
||||
mysqlTlsModeDisabled: "비활성화",
|
||||
mysqlTlsModeRequired: "필수",
|
||||
|
||||
@@ -962,7 +962,9 @@ export default withEnglishFallback({
|
||||
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.",
|
||||
firebirdCharsetHint: "Controla o conjunto de caracteres da conexão e a decodificação de campos CHARACTER SET NONE. Para dados legados GBK ou de outra codificação em campos ISO8859_1, configure também a codificação de leitura legada.",
|
||||
firebirdDataCharset: "Codificação de leitura legada",
|
||||
firebirdDataCharsetHint: "Para campos declarados como ISO8859_1, mas armazenados como GBK ou outra codificação. Selecione ISO8859_1 como conjunto de caracteres da conexão. Afeta apenas a leitura de texto e comentários; a escrita usa o conjunto de caracteres da conexão.",
|
||||
mysqlTlsModePreferred: "Preferencial",
|
||||
mysqlTlsModeDisabled: "Desabilitado",
|
||||
mysqlTlsModeRequired: "Obrigatório",
|
||||
|
||||
@@ -977,7 +977,9 @@ export default withEnglishFallback({
|
||||
redisTlsInsecureHint: "Эквивалентно redis-cli --tls --insecure, для самоподписанных сертификатов или частных CA.",
|
||||
mysqlTlsMode: "Режим TLS",
|
||||
firebirdCharset: "Кодировка",
|
||||
firebirdCharsetHint: "Декодирует текст в столбцах CHARACTER SET NONE (например, старые китайские данные в кодировке GBK). Если текст отображается некорректно, выберите фактическую кодировку данных.",
|
||||
firebirdCharsetHint: "Управляет кодировкой соединения и декодированием полей CHARACTER SET NONE. Для данных GBK или другой старой кодировки в полях ISO8859_1 также настройте кодировку чтения старых данных.",
|
||||
firebirdDataCharset: "Кодировка чтения старых данных",
|
||||
firebirdDataCharsetHint: "Для полей, объявленных ISO8859_1, но сохранённых в GBK или другой кодировке. Выберите ISO8859_1 для соединения. Влияет только на чтение текста и комментариев; запись использует кодировку соединения.",
|
||||
mysqlTlsModePreferred: "Предпочтительный",
|
||||
mysqlTlsModeDisabled: "Отключено",
|
||||
mysqlTlsModeRequired: "Обязательный",
|
||||
|
||||
@@ -752,7 +752,9 @@ export default withEnglishFallback({
|
||||
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.",
|
||||
firebirdCharsetHint: "Bağlantı karakter kümesini ve CHARACTER SET NONE alanlarının çözümlemesini ayarlar. ISO8859_1 alanlarında saklanan GBK veya diğer eski veriler için eski veri okuma kodlamasını da ayarlayın.",
|
||||
firebirdDataCharset: "Eski veri okuma kodlaması",
|
||||
firebirdDataCharsetHint: "ISO8859_1 olarak tanımlanan ancak GBK veya başka bir kodlamada saklanan alanlar için. Bağlantı karakter kümesi olarak ISO8859_1 seçin. Yalnızca metin ve yorum okumayı etkiler; yazma bağlantı karakter kümesini kullanır.",
|
||||
mysqlTlsModePreferred: "Tercih edilen",
|
||||
mysqlTlsModeDisabled: "Devre dışı",
|
||||
mysqlTlsModeRequired: "Zorunlu",
|
||||
|
||||
@@ -1002,7 +1002,9 @@ export default withEnglishFallback({
|
||||
redisTlsInsecureHint: "等价于 redis-cli --tls --insecure,适用于自签名证书或私有 CA。",
|
||||
mysqlTlsMode: "TLS 模式",
|
||||
firebirdCharset: "连接字符集",
|
||||
firebirdCharsetHint: "用于解码 CHARACTER SET NONE 字段中的文本(例如旧库以 GBK 存放的中文)。文本出现乱码时,请按数据的实际编码选择。",
|
||||
firebirdCharsetHint: "控制连接字符集及 CHARACTER SET NONE 字段的解码。字段声明为 ISO8859_1、实际存为 GBK 等编码时,还需设置旧库读取编码。",
|
||||
firebirdDataCharset: "旧库读取编码",
|
||||
firebirdDataCharsetHint: "字段声明为 ISO8859_1、实际存为 GBK 等编码时使用。连接字符集请选择 ISO8859_1。仅影响文本和注释读取;写入仍使用连接字符集。",
|
||||
mysqlTlsModePreferred: "优先使用",
|
||||
mysqlTlsModeDisabled: "禁用",
|
||||
mysqlTlsModeRequired: "必须使用",
|
||||
|
||||
@@ -966,7 +966,9 @@ export default withEnglishFallback({
|
||||
redisTlsInsecureHint: "等價於 redis-cli --tls --insecure,適用於自簽名憑證或私有 CA。",
|
||||
mysqlTlsMode: "TLS 模式",
|
||||
firebirdCharset: "連線字元集",
|
||||
firebirdCharsetHint: "用於解碼 CHARACTER SET NONE 欄位中的文字(例如舊資料庫以 GBK 儲存的中文)。文字出現亂碼時,請依資料的實際編碼選擇。",
|
||||
firebirdCharsetHint: "控制連線字元集及 CHARACTER SET NONE 欄位的解碼。欄位宣告為 ISO8859_1、實際儲存為 GBK 等編碼時,還需設定舊資料庫讀取編碼。",
|
||||
firebirdDataCharset: "舊資料庫讀取編碼",
|
||||
firebirdDataCharsetHint: "欄位宣告為 ISO8859_1、實際儲存為 GBK 等編碼時使用。連線字元集請選擇 ISO8859_1。僅影響文字與註解讀取;寫入仍使用連線字元集。",
|
||||
mysqlTlsModePreferred: "優先使用",
|
||||
mysqlTlsModeDisabled: "停用",
|
||||
mysqlTlsModeRequired: "必須使用",
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 60 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 103 KiB |
Reference in New Issue
Block a user