"Has characters not alphanumeric or underscore" is pretty specific, so yep, it's that stray semi-colon. Yes, most SQL batchmode processors require semicolons at the end of statements but that's so they can handle multiple statements, they usually strip off the semicolon before sending the statement to the SQL processor.
DBI expects DBDs to not use the statement-terminating semicolon and most DBDs respect that. (Though this may change as DBI becaomes able to handle multiple statements in a single call). For the time being let's be thankful that the DBDs don't let users do things like
my $sth = $dbh->prepare("SELECT * FROM ?");
$sth->execute(" MyTable2; DELETE * FROM MyTable2 ");
Sharp-eyed monks will notice at least two places there where a well-behaved DBD will complain.
update: added missing parens; thanks tanktalus