Как предотвратить обрезку пробелов в строковых параметрах, отправляемых в базу данных?

#java #mysql

#java #mysql

Вопрос:

Я использую подготовленные операторы для загрузки в свою базу данных различных небольших строк, и, похоже, java автоматически обрезает их. Когда я пытаюсь загрузить значение » » (один пробел), оно заканчивается как пустая строка в базе данных. Несколько пробелов дают одинаковый результат, поэтому кажется, что они обрезаются.

Я не вызываю .trim() для текста, у меня просто есть это:

 cmd.setString(3, " ");
  

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

Есть ли где-нибудь какая-нибудь опция, чтобы отключить это? Или какой-то обходной путь?

Ответ №1:

Спецификация java.sql не устанавливает, что драйвер должен выполнять операцию trim() . Но на всякий случай не могли бы вы попробовать следующее?

  cmd.setNString(3, " ");
  

Комментарии:

1. setNString также, к сожалению, приводит к пустой строке

2. Я проверил исходный код PreparedStatement для Connector/J, и там нет вызова функции trim() . Так что, возможно, есть еще одна ошибка, которую мы не видим.

3. Ну, он загружается в поле CHAR (1), и он правильно работал с .net connector. На самом деле больше не на что смотреть, поэтому я не уверен, откуда возникает проблема…

4. Как ни странно, новые строки вводятся нормально. Но несколько пробелов превращаются в пустую строку…

5. Я не вижу setChar, но теперь все в порядке. Спасибо за помощь, но кажется, что это что-то странное в том, как connector / j обрабатывает поле символа. Я попытался переключить поле на VARCHAR(1), и теперь вводится пробел. Я понятия не имею, почему это имеет значение.

Ответ №2:

можете ли вы попробовать это.

 String s= new String(" ");
cmd.setBytes(3,s.getBytes(s));
  

проверьте, поможет ли это.

Ответ №3:

У меня была аналогичная проблема при вызове хранимой процедуры в mysql. Но получается, если вы запускаете это из mysql:

 select '  ' = '';
  

Он возвращает (1) true .

Итак, моя хранимая процедура отчитывалась как пустая строка, но хранимая процедура получила строку с пробелами.

Чтобы исправить, мне пришлось проверить наличие пустой строки с помощью LIKE или проверить, равна ли длина символа 0.