В моей программе я подключаюсь к базе данных Microsoft SQL с помощью JTDS (http://jtds.sourceforge.net/). Кодирование моей базы данных iso-8859-1. Однако для отправки запросов в Java я должен использовать строки (которые обычно кодируются с помощью UTF). Возможно ли отправить запрос с другой кодировкой, чем UTF?
EDIT: результаты отображаются неправильно после использования INSERT или UPDATE. Если я только выбираю из базы данных, специальные символы отображаются справа.
Одним из выдающихся принципов дизайна java является то, что текст String всегда является Unicode. В общем, вы даже не можете видеть, что это в Юникоде, так как только при получении байта вы должны указать кодировку, в которую должны быть преобразованы байты. Поэтому вам не нужно ничего делать - в идеале.
Ошибка может возникнуть из:
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.
Драйвер 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" также выглядит как ö).
Когда я подключаюсь к базе данных 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 );
}