#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.