Регулярное выражение для замены кавычек в операторах вставки базы данных - PullRequest
1 голос
/ 21 августа 2009

Я конвертирую базу данных sqlite3 в mysql.

У меня есть хороший командный файл для sed, который изменяет AUTOINCREMEMT и другие необходимые вещи, но я застрял на последней: двойные кавычки.

Формат дампа sqlite3:

CREATE TABLE "products" (
  "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
  "name" varchar(255), 
  "desc" varchar(255) );

INSERT INTO "products" VALUES(1,'Flux Capacitor',
  'This is the "real" thing.\nPromise!')

Для первого утверждения я могу заменить все двойные кавычки на обратные кавычки, и mysql будет счастлив.

Однако информация о моем продукте содержит двойные кавычки в данных. Как я могу исключить их из замены? Я пытался заменить только эти двойные кавычки заполнителем, затем я мог заменить все остальные двойные кавычки, затем я мог бы заменить заполнитель обратно, но мое регулярное выражение не соответствует номиналу.

Это было так далеко, как я получил:

/"[^"]*"/s

... чтобы соответствовать текстам с двойными кавычками, но я не мог понять, как определить, что должны совпадать только двойные кавычки внутри одинарных кавычек.

Ответы [ 3 ]

3 голосов
/ 21 августа 2009

Я бы изменил MySQL, чтобы принимать двойные кавычки в качестве разделителей идентификаторов. Это стандартное поведение SQL, и вы можете заставить MySQL вести себя таким образом в режиме SQL:

mysql> SET SQL_MODE = ANSI;

Или, более конкретно:

mysql> SET SQL_MODE = ANSI_QUOTES;

Тогда MySQL должен понять ваш дамп данных.

См. " Режимы SQL сервера " для получения дополнительной информации.

0 голосов
/ 21 августа 2009

Я могу заменить все двойные кавычки на обратные, и mysql будет счастлив.

Счастлив, но это не решило бы всей проблемы, поэтому может легко упасть в будущем. Апостроф и обратный слеш также работают по-разному в MySQL.

информация о моем продукте содержит двойные кавычки Как я могу исключить их из замены?

Вы не можете надежно. Синтаксис SQL на самом деле довольно сложный и в общем случае не может быть проанализирован путем взлома регулярных выражений.

Предложение Билла изменить SQL_MODE для соответствия существующему синтаксису - гораздо лучший подход. Я все время запускаю MySQL в режиме ANSI, так как мне не нравится приспосабливать свои приложения к ошибкам одной конкретной базы данных.

0 голосов
/ 21 августа 2009

Ну, я знаю, как легко решить это в PHP с preg_replace_callback():


<?php

    $sql = file_get_contents('sqlite3 dump.txt');
    function callback($match) { return str_replace('"', '`', $match[0]); }
    $sql = preg_replace_callback('/CREATE TABLE .*?;/s', callback, $sql);
    echo preg_replace_callback('/INSERT INTO .*? VALUES/s', callback, $sql);

?>

Если вы не можете "SET SQL_MODE = ANSI_QUOTES", как сказал Билл Карвин.

...