Кодировка JDBC iso-8859-1

1

В моей программе я подключаюсь к базе данных Microsoft SQL с помощью JTDS (http://jtds.sourceforge.net/). Кодирование моей базы данных iso-8859-1. Однако для отправки запросов в Java я должен использовать строки (которые обычно кодируются с помощью UTF). Возможно ли отправить запрос с другой кодировкой, чем UTF?

EDIT: результаты отображаются неправильно после использования INSERT или UPDATE. Если я только выбираю из базы данных, специальные символы отображаются справа.

  • 1
    Эх ... у вас есть неправильные представления о кодировке символов. Вы испытываете какие-либо проблемы?
  • 0
    Некоторые символы, такие как «äöüß», отображаются неправильно.
Показать ещё 4 комментария
Теги:
sql-server
jdbc
encoding
jtds

3 ответа

2

Одним из выдающихся принципов дизайна java является то, что текст String всегда является Unicode. В общем, вы даже не можете видеть, что это в Юникоде, так как только при получении байта вы должны указать кодировку, в которую должны быть преобразованы байты. Поэтому вам не нужно ничего делать - в идеале.

Ошибка может возникнуть из:

  • Строковые закодированные строки в Java: кодировка источника java должна быть такой же, как кодировка java-компилятора javac. Это можно проверить, попробовав \u00FC вместо ü.
  • Настройки драйвера
  • Настройки соединения
  • Определение базы данных/таблицы/столбца
  • Ошибка при ложном размещении: при выдаче результатов при вводе данных

Попробуйте INSERT из "\ u00FC + ü" и SELECT для сравнения байтов. Сбросьте байтовые коды. (Чтобы избежать проблем с консолью.)

Arrays.toString(string.getBytes("ISO-8859-1"));

Не пытайтесь ремонт как new String(s.getBytes("ISO-8859-1"), "UTF-8") - или так.

Если в этом нет никаких проблем, следует искать причину в другом месте.

BTW: лучше использовать Windows-1252 (Windows Latin-1) вместо ISO-8859 (Latin-1), поскольку это позволяет использовать некоторые специальные символы, такие как запятые, кавычки (диапазон 0x80 - 0xBF). HTML также принимает Windows-1252 как ISO-8859-1.

1

Драйвер JDBC фактически обрабатывает преобразование внутренне, если вы не просто создаете вставки путем объединения строк:

(Это плохо, никогда не делайте этого)

String aValue = "äöü";
String insert = "INSERT INTO table VALUES('" + aValue + "')";
Statement s = connection.createStatement();
s.executeUpdate(insert);

Используйте подготовленный оператор (который также избегает дыр безопасности, таких как SQL-инъекция):

String aValue = "äöü";
String insert = "INSERT INTO table VALUES(?)";
PreparedStatement s = connection.prepareStatement(insert);
s.setString(1, aValue);
s.executeUpdate();

Изменение: также убедитесь, что то, что вы пытаетесь вставить, действительно то, что вы хотите вставить. Для немецких умляутов в юникоде существует более одного возможного представления, например, ö может быть представлено как "\ u00F6", но оно может также (редко, в зависимости от источника) быть представлено с использованием сочетания диакритики (например, "o\u0308" также выглядит как ö).

0

Когда я подключаюсь к базе данных Access (.mdb), которая кодируется с помощью ISO-8859-1, я использую этот синтаксис:

String dbPath = "fakeDBPath.mdb";
String database = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" + dbPath + ";DriverID=22;READONLY=false}";

final Properties prop = new Properties();
prop.put("charSet", "ISO-8859-1");
Connection conn = DriverManager.getConnection( database, prop );

После того, как я получу Connection, я могу использовать строки Java с необходимостью указывать любую дополнительную кодировку. Возможно, JTDS поддерживает определенную настройку для кодирования.

Например, чтобы вставить данные в БД:

String cmd = "INSERT INTO Table (Col1,Col2,Col3,Col4) VALUES (1000,'àèìòù','éþü','fake data');";
Statement s = DBTable_1.getStatement();
try
{
    int r = s.executeUpdate(cmd);
} catch ( SQLException ex )
{
    Logger.getLogger( Main.class.getName() ).log( Level.SEVERE, null, ex );
}

И читать из БД:

String cmd = "SELECT * FROM Table WHERE Col2='àèìòù';";
Statement s = DBTable_1.getStatement();
try
{
  ResultSet r = s.executeQuery(cmd);

  while(r.next())
  {          
    System.out.println("Col2: " + r.getString(2) + " Col3:" + r.getString(3));
  }

} catch ( SQLException ex )
{
  Logger.getLogger( Main.class.getName() ).log( Level.SEVERE, null, ex );
}   

Ещё вопросы

Сообщество Overcoder
Наверх
Меню