Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java и базы данных
Войти
Регистрация
Восстановить пароль
 
Masel
4 / 4 / 0
Регистрация: 01.04.2009
Сообщений: 72
#1

PreparedStatement + MySQL - Java БД

03.12.2013, 23:21. Просмотров 854. Ответов 11
Метки нет (Все метки)

Коллеги, привет!

Столкнулся с такой проблемкой. Хочу с помощью PreparedStatement создать схему на MySQL, собственно использую такой напрашивающийся код:
Java
1
2
3
PreparedStatement ps = conn.prepareStatement("CREATE SCHEMA ? DEFAULT CHARACTER SET utf8 ;") ;
ps.setString(1, getScheme());
ps.execute();
Ну и собственно все падает, потому что получается запрос:
MySQL
1
CREATE SCHEMA 'tttt' DEFAULT CHARACTER SET utf8 ;
вместо
MySQL
1
CREATE SCHEMA `tttt` DEFAULT CHARACTER SET utf8 ;
Собственно вопроса 2:
1. Нафига козе баян? В смысле, почему MySQL с нормальными кавычками работать не хочет?
2. Как быть? Типа инъекции в таких запросах не страшны и можно юзать простой Statement и тупо вручную собранной строкой?

Заранее спасибо за ответы, коллеги!
http://www.cyberforum.ru/java-database/thread932055.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.12.2013, 23:21
Я подобрал для вас темы с готовыми решениями и ответами на вопрос PreparedStatement + MySQL (Java БД):

PreparedStatement не работатет
Доброе время суток. Код public Users getLoginAndPassword(String login) throws...

PostgreSQL autoincrement PreparedStatement
Коллеги кто нибудь работал с PostgreSQL? B MySQL всё просто задаешь колонке...

Как закрывать connection in PreparedStatement
Народ всем привет есть БД на postgres которое подключается к коду при ...

Зачем PreparedStatement, если есть Statament + метод + параметр?
Допустим вот Statement + метод + параметр public void...

Не подключается MySQL (java.lang.ClassNotFoundException: com.mysql.jdbc.Driver)
Код : import java.io.*; import java.sql.*; public class Connect {...

11
KuKu
1559 / 1037 / 93
Регистрация: 17.04.2009
Сообщений: 2,995
04.12.2013, 08:33 #2
У меня есть подозрение, что для команды CREATE SCHEMA вообще невозможно использовать PreparedStatement. Создавать схему с биндавым названием просто нет смысла. И это не из-за кавычек.
0
Masel
4 / 4 / 0
Регистрация: 01.04.2009
Сообщений: 72
04.12.2013, 09:01  [ТС] #3
Почему нет смысла? Я хочу написать проливщик бд, к которому извне приходит желаемое имя схемы. Чем не параметр?
Ну ок, что у нас остается из хороших и логичных решений? Формирую запрос вручную и исполняю на соединение?

Да, и косяк именно в кавычках, воркбенч со мной согласен
0
KuKu
1559 / 1037 / 93
Регистрация: 17.04.2009
Сообщений: 2,995
04.12.2013, 09:12 #4
Цитата Сообщение от Masel Посмотреть сообщение
Ну ок, что у нас остается из хороших и логичных решений? Формирую запрос вручную и исполняю на соединение?
Да, типа того.

Цитата Сообщение от Masel Посмотреть сообщение
Да, и косяк именно в кавычках, воркбенч со мной согласен
Вы в курсе, что делает prepareStatement? Когда выполняется этот запрос, в mysql идет отдельно текст запроса и отдельно параметры. В примере, в БД приходит просто бинарная строка tttt, нет там никаких кавычек.
0
Masel
4 / 4 / 0
Регистрация: 01.04.2009
Сообщений: 72
04.12.2013, 09:31  [ТС] #5
Ясненько, спасибо.
Если кто-то в курсе в чем прикол обратных кавычек, то мне не так сильно, но по прежнему интересно

Добавлено через 17 минут
Пока набирал с телефона сообщение, оно морально устарело

Итак, по обновленной информации у нас якобы параметры уходят прямиком на БД... Это реально так? Можно глянуть где про это написано? Просто я свято верил, что это зона ответственности JDBC-драйвера подготовить верный запрос и расставить верные кавычки
0
KuKu
1559 / 1037 / 93
Регистрация: 17.04.2009
Сообщений: 2,995
04.12.2013, 10:06 #6
Тут для сишного апи, но идея та же. Суть в том, что prepareStatement работает с bind variables. А суть у bind variables всюду одна(ну у вменяемых СУБД).
1
turbanoff
Эксперт Java
4008 / 3743 / 739
Регистрация: 18.05.2010
Сообщений: 9,323
Записей в блоге: 11
Завершенные тесты: 1
04.12.2013, 10:22 #7
Цитата Сообщение от Masel Посмотреть сообщение
1. Нафига козе баян? В смысле, почему MySQL с нормальными кавычками работать не хочет?
Потому что нормальные кавычки во всех нормальных СУБД обозначают строковый литерал.
0
Masel
4 / 4 / 0
Регистрация: 01.04.2009
Сообщений: 72
04.12.2013, 12:57  [ТС] #8
Цитата Сообщение от turbanoff Посмотреть сообщение
Потому что нормальные кавычки во всех нормальных СУБД обозначают строковый литерал.
а имя схемы это не строковый литерал?
0
turbanoff
Эксперт Java
4008 / 3743 / 739
Регистрация: 18.05.2010
Сообщений: 9,323
Записей в блоге: 11
Завершенные тесты: 1
04.12.2013, 13:31 #9
Цитата Сообщение от Masel Посмотреть сообщение
а имя схемы это не строковый литерал?
Нет, имя схемы - идентификатор.
0
Masel
4 / 4 / 0
Регистрация: 01.04.2009
Сообщений: 72
04.12.2013, 14:12  [ТС] #10
Цитата Сообщение от turbanoff Посмотреть сообщение
Нет, имя схемы - идентификатор.
Строковый всё равно же

как по мне намудрили лишку с синтаксисом. Но чо уж теперь роптать, придется приспосабливаться)
0
turbanoff
Эксперт Java
4008 / 3743 / 739
Регистрация: 18.05.2010
Сообщений: 9,323
Записей в блоге: 11
Завершенные тесты: 1
04.12.2013, 14:55 #11
Цитата Сообщение от Masel Посмотреть сообщение
как по мне намудрили лишку с синтаксисом. Но чо уж теперь роптать, придется приспосабливаться)
Так сделано во всех СУБД. Вы никогда не пробовали написать парсер какого-либо языка? Многое начинает проясняться, когда делаешь сам.
0
Masel
4 / 4 / 0
Регистрация: 01.04.2009
Сообщений: 72
04.12.2013, 17:38  [ТС] #12
Цитата Сообщение от turbanoff Посмотреть сообщение
Так сделано во всех СУБД. Вы никогда не пробовали написать парсер какого-либо языка? Многое начинает проясняться, когда делаешь сам.
было дело, но это уже оффтоп)
0
04.12.2013, 17:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.12.2013, 17:38
Привет! Вот еще темы с решениями:

Синхронизация PreparedStatement
Вызываются разные статические процедуры одного класса которые используют одни...

MySQL WorkBench vs MySQL CL
MySQL WorkBench vs MySQL Command Line есть 2 таблицы. на скрине. нужно...

PreparedStatement
всем добрый день, есть код : package com.mysql; public...

PreparedStatement
Здравствуйте, необходимо сделать одно DAO, и в нём 2 PreparedStatement (для...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru