Regexp لاستبدال علامات الاقتباس في بيانات إدراج قاعدة البيانات

StackOverflow https://stackoverflow.com/questions/1313726

  •  19-09-2019
  •  | 
  •  

سؤال

أنا تحويل قاعدة بيانات 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!')

للبيان الأول، يمكنني استبدال الكل يقتبس مزدوج مع backticks و mysql سيكون سعيدا.

ومع ذلك، فإن معلومات المنتج الخاصة بي لديها اقتباسات مزدوجة في البيانات. كيف يمكنني استبعاد هذه من استبدالها؟ كنت أحاول استبدال تلك الاقتباسات المزدوجة فقط مع عنصر نائب، ثم يمكنني استبدال جميع علامات الاقتباس المزدوجة الأخرى، ثم يمكنني تغيير هذا العنصر النائب مرة أخرى، لكن بلدي Regex-fu لا يصل إلى قدم المساواة.

كان هذا بقدر ما حصلت عليه:

/"[^"]*"/s

... لتتناسب مع النصوص المقتبسة المزدوجة، لكنني لم أستطع معرفة كيفية التأهل على أنه يجب مطابقة اقتباسات مزدوجة فقط داخل علامات اقتباس واحدة.

هل كانت مفيدة؟

المحلول

وأود أن أغير MySQL لقبول اقتباس مزدوج كمحددات معرف. هذا هو سلوك SQL القياسي، ويمكنك أن تجعل MySQL تتصرف بهذه الطريقة مع وضع SQL:

mysql> SET SQL_MODE = ANSI;

أو أكثر تحديدا:

mysql> SET SQL_MODE = ANSI_QUOTES;

ثم يجب أن يفهم mysql تفريغ البيانات الخاصة بك.

يرى "أوضاع خادم SQL." للمزيد من المعلومات.

نصائح أخرى

حسنا، أعرف كيفية حلها بسهولة في 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);

?>

ما لم تتمكن من "تعيين SQL_Mode = ANSI_QUOTES" كما قال بيل كاروين.

يمكنني استبدال جميع علامات الاقتباس المزدوجة مع Backticks و MySQL ستكون سعيدا.

سعيد الآن، لكنه لن يحل المشكلة بأكملها، لذلك يمكن أن تسقط بسهولة في المستقبل. العمل الفاصل والسلع الخلفية تعمل أيضا بشكل مختلف في MySQL.

معلومات المنتج الخاصة بي لديها اقتباسات مزدوجة في البيانات. كيف يمكنني استبعاد هذه من استبدالها؟

لا يمكنك موثوق. بناء جملة SQL هو في الواقع معقد تماما، ولا يمكن تحليله في الحالة العامة بواسطة Regex Hacking.

اقتراح مشروع القانون مع تغيير SQL_Mode لتناسب بناء الجملة الحالي هو نهج أفضل بكثير. أقوم بتشغيل MySQL في وضع ANSI طوال الوقت، حيث أنني لا أحب الحاجة إلى تخصيص تطبيقاتي إلى Fixbles قاعدة بيانات معينة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top