W rzeczywistości nie działa tak, jak napisałem. Po prostu koduję:
set @preparedstmt = concat('SELECT tid, LENGTH(message) len FROM ? where tid=? and first=1');
prepare stmt from prepared_stmt;
execute stmt using v_tid;
drop prepare stmt;
Wystarczy zadbać o nazwę tabeli, nie należy jej zastępować symbolem zastępczym. Tak więc @preparedstmt należy wygenerować metodą concat, aby wykonać oświadczenie, w którym po prostu zastępujemy parametry w warunkach symbolem zastępczym, ale nie nazwę tabeli.