нераспознанный токен: & quot; \ & quot; в sqlite

я запускал свои коды и получил эту ошибку

[Учение \ DBAL \ Exception \ DriverException] Возникла исключительная ситуация при выполнении команды ALTER TABLE
ImportGenius \ Entities \ SQLite \ TradeBase \ UnitedStates \ UnitedStatesImporterIndex Переименовать в ImportGenius \ Entities \ SQLite \ TradeBa
се \ UnitedStates \ UnitedStatesImporterIndexTemp_2,
ImportGenius \ Entities \ SQLite \ TradeBase \ UnitedStates \ UnitedStatesImporterIndexTemp RENAME TO ImportGenius \ Entities \ SQLite \ Tra
опошлить \ UnitedStates \ UnitedStatesImporterIndex
«:
SQLSTATE [HY000]: общая ошибка: 1 нераспознанный токен: «\»

Это мои коды:

private function switchTable(Connection $connection, $primaryTableName, $tempTableName)
{
$secondaryTempTableName = $tempTableName.'_2';
$rawSqlQuery = "ALTER TABLE
{$primaryTableName} RENAME TO {$secondaryTempTableName},
{$tempTableName} RENAME TO {$primaryTableName}
";

$stmt = $connection->prepare($rawSqlQuery);
$stmt->execute();
}

-2

Решение

Скорее всего, одна из этих четырех переменных в вашем операторе SQL на самом деле имеет \ характер в нем или иным образом искажен.

92,7% (А) все проблемы SQL-операторов могут быть решены, если вы просто распечатать ваш запрос прежде чем пытаться выполнить это, что-то вроде:

var_dump ($rawSqlQuery);

В этом случае, \ не является допустимым символом для имени таблицы. На самом деле, это вовсе не действительный автономный токен.

Если вы изучите исходный код SQLite, отвечающий за обработку различных имен таблиц (sqlite3CreateTable, sqlite3AlterRenameTable и так далее) они вообще сводятся к звонкам sqlite3GetToken чтобы получить имена таблиц.

Эта функция, в свою очередь, выполняет большое количество проверок символов токена, но суть в том, что вне строки \ возвращает токен TK_ILLEGAL — он не соответствует действительным токенам, поэтому просто выпадает из switch утверждение в какой момент вы видите:

*tokenType = TK_ILLEGAL;
return 1;

Это означает, что это не действует в этом контексте.

И, на самом деле, вы можете увидеть это, если введете любую из следующих «команд»:

\;
create table x\y (a integer);
alter table x rename to a\b;

(А) Статистика взята из воздуха, фактическое значение может отличаться 🙂

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]