سؤال

لديّ جداول في mysql 5 db مع أسماء مسبقة مع علامة الدولار '$' ie tablename $ mytable

أنا أستخدم Spring 3.0 JDBCtemplate لإجراء استعلام محدد ولكن لم أستطع تشغيله.

بمعنى آخر

    String tablename = "$AAPL";

    private static final String STOCK_SELECT = 
    "select symbol, open, high, low, close, vol, ev from ?";

    jdbcTemplate.query(STOCK_SELECT, 
                       new Object[] { tablename },
                       new RowMapper() { .... } );

سيؤدي هذا دائمًا إلى رمي alysqlexception ، ويفترض بسبب علامة $. إذا قمت فقط بإجراء استعلام عادي بدون أي بار ، أي.

    private static final String STOCK_SELECT = 
    "select symbol, open, high, low, close, vol, ev from $AAPL";

ثم كل شيء يعمل.

كيف يمكنني الهروب من علامة $ باستخدام jdbctemplate؟

-تحرير ، ما انتهى بي الأمر-

بدلاً من تمرير اسم الجدول "$ AAPL" إلى JDBCtemplate ، أقوم فقط بإنشاء سلسلة SQL يدويًا ، أي

 jdbcTemplate.query( getStockSelect("$AAPL", .., .. ));
هل كانت مفيدة؟

المحلول

معلومات قاعدة البيانات مثل أسماء الجدول والمعرفات/المعرفات لا تهدف إلى تحديد المعلمة. يستخدم MySQL backtick (`) لأسماء/معرفات الجدول والأعمدة. من المحتمل أن يكون استعلامك المعلمات على النحو التالي:

 select symbol, open, high, low, close, vol, ev from "$AAPL"

لست على دراية بأي واجهة برمجة تطبيقات قياسية لمعرفات المعلمة/الهروب من هذا القبيل. أوصي ، إذا استطعت ، لمجرد الحصول عليها بشكل ثابت. نظرًا لأنها نفس الأعمدة التي تقسم الجدول قد يكون أيضًا خيارًا. أخيرًا ، إذا كنت لا تزال بحاجة إلى أن تكون ديناميكية ، فسيتعين عليك الهروب من اسم الجدول بنفسك ، أوصي فقط بسحبه من القائمة البيضاء.

قد ترغب في إلقاء نظرة على وثائق MySQL حول كيفية الهروب من المعرفات.

نصائح أخرى

SQL يدعم المعرفات المحددة حتى تتمكن من استخدام علامات الترقيم أو المساحة البيضاء أو الرموز الخاصة أو الأحرف الدولية أو الكلمات الرئيسية SQL كأسماء الجدول أو أسماء الأعمدة.

انظر إجابتي السابقة على هل تستخدم قواعد البيانات المختلفة اقتباس الاسم مختلف؟

في MySQL ، استخدم الربعات الخلفية:

private static final String STOCK_SELECT = 
"select symbol, open, high, low, close, vol, ev from `$AAPL`";

أو قم بتعيين SQL_MODE على وضع ANSI واستخدم Quotes مزدوجة:

private static final String STOCK_SELECT = 
"select symbol, open, high, low, close, vol, ev from \"$AAPL\"";

لا يمكنك استخدام أ ? العنصر النائب لاسم الجدول في SQL. هذا ليس مدعومًا باللغة. يمكنك استخدام معلمة فقط حيث يمكنك عادة استخدام قيمة حرفية ، مثل عدد صحيح أو سلسلة واحدة مقبل.

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