Убедитесь, что значение String не превышает 2000 байтов в столбце таблицы базы данных Oracle - PullRequest
3 голосов
/ 21 октября 2009

Хотите обрезать строку ошибки, чтобы она точно соответствовала столбцу таблицы Oracle VARCHAR2 (2000 BYTE)

Расчетные силы:

  1. Основная цель - подгонка к столбцу таблицы.

  2. 90-95% текста строки - это сообщение об исключении и трассировка стека. Но в нем может быть какое-то имя клиента с французскими и турецкими буквами, которое я не хочу игнорировать и которое я вижу как? или что угодно.

  3. Я хочу, чтобы код был очень простым. Кодировка базы данных может измениться. Можно вводить китайские иероглифы, но я все равно хочу, чтобы код работал.

Должно быть, "чертовски просто", но это заставило меня задуматься.

Какие есть предложения?

Наверное, лучший вариант - конвертировать в ascii. Но я придумал вариант, который не очень хорош, но, вероятно, работает.

public static String trimStringToBytes(StringBuilder builder, int maximumBytes)
{
    String truncatedString = builder.length() > maximumBytes ?  builder.substring(0, maximumBytes) : builder.toString();

    byte[] bytes;
    String asciiCharsetName = "US-ASCII";
    try
    {
        bytes = truncatedString.getBytes(asciiCharsetName);
    }
    catch (UnsupportedEncodingException e)
    {
        //not really possible as JVM should support always US-ASCII but anyway
        int worstCaseScenarioBytesPerCharacter = 4;
        bytes = truncatedString.substring(0, truncatedString.length() / worstCaseScenarioBytesPerCharacter).getBytes();
    }

    return new String(bytes, 0, bytes.length > maximumBytes ? maximumBytes : bytes.length);
}

Ответы [ 4 ]

2 голосов
/ 11 января 2010

Я бы рекомендовал делать это не в Java, а вместо этого в SQL, когда вы выполняете INSERT.

Например, в Oracle вы можете использовать функцию SUBSTR для обрезки, используя connection.prepareStatement:

insert into mytable (col1, col2) values (?, substr(?, 0, 2000));

Затем задайте значения col1 и col2 для PreparedStatement, и Oracle должен получить первые 2000 символов / байтов / что угодно, что делает этот оракул, и установить это.

Возможно, даже стоит сделать это с помощью хранимой процедуры, передав всю строку в качестве аргумента VARCHAR2 процедуре, которая затем обрезает ее и вставляет строку. Нет необходимости, чтобы приложение связывалось с базовой семантикой хранилища.

1 голос
/ 11 января 2010

Вам не нужно будет обрезать строку, если вы используете CLOB .

0 голосов
/ 21 октября 2009

Можно ли изменить столбец на VARCHAR2 (2000 CHAR)? Это полностью устранило бы проблему кодирования.

0 голосов
/ 21 октября 2009

Я думаю, что ваш метод должен работать, но преднамеренная потеря всех не-ASCII символов довольно неприятна. Если у вас есть сообщения на китайском языке, они будут полностью заменены на ???

IMO, лучше всего было бы использовать функции SQL в запросе вставки для выполнения обрезки. Это гарантирует, что вы никогда не превысите размер столбца И потеряете как можно меньше данных. Это также намного менее подвержено ошибкам, чем попытки выполнять усечение с учетом кодирования в коде Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...