سؤال

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

وهذا هو:

SELECT `id`, `name`, `anotherfield` ...
-- vs --
SELECT id, name, anotherfield ...
هل كانت مفيدة؟

المحلول

باستخدام backticks يسمح لك استخدام الشخصيات البديلة.في الاستعلام الكتابة ليست هذه المشكلة, ولكن إذا افترضنا يمكنك فقط استخدام backticks, أظن أن ذلك يتيح لك الحصول على بعيدا مع الأشياء السخيفة مثل

SELECT `id`, `my name`, `another field` , `field,with,comma` 

التي لا بالطبع توليد بشدة اسمه الجداول.

إذا كنت مجرد كونها موجزة أنا لا أرى مشكلة في ذلك ، عليك ملاحظة إذا قمت بتشغيل الاستعلام الخاص بك على هذا النحو

EXPLAIN EXTENDED Select foo,bar,baz 

ولدت محذرا من أن يعود سوف يعود-القراد و مؤهل أسماء الجداول.حتى إذا كنت تستخدم استعلام الجيل الميزات الآلي إعادة كتابة استعلامات, backticks من شأنه أن يجعل أي تحليل التعليمات البرمجية الخاصة بك أقل الخلط.

أعتقد ومع ذلك, بدلا من تكليف ما إذا كان أو لا يمكنك استخدام backticks ، ينبغي أن يكون معيارا الأسماء.يحل أكثر واقعية المشاكل.

نصائح أخرى

والمشكلة الوحيدة مع backticks هي أنها لا ANSI-SQL متوافقة، على سبيل المثال أنها لا تعمل في SQL Server.

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

لي فإنه يجعل الكثير من الشعور استخدامها في جميع الأوقات عند التعامل مع أسماء الحقول.

  • أولا: تحصل مرة واحدة في العادة ، فإنه لا يضر أن مجرد ضرب backtick الرئيسية.
  • ثانيا, بالنسبة لي, فإنه يجعل من السهل أن نرى ما هي بالضبط الحقول في الاستعلام الخاص بك ، وما هي الكلمات أو الأساليب.
  • وأخيرا ، فإنه يسمح لك استخدام أي مجال اسم يحلو لك عند تصميم الجدول الخاص بك.في بعض الأحيان يجعل الكثير من معانيها أن اسم حقل "مفتاح" ، "النظام" أو "القيم"...والتي تتطلب backticks عند الإشارة إليهم.

وBackticks ليست جزءا من معيار ANSI SQL. من دليل ماي :

<اقتباس فقرة>   

إذا وضع ANSI_QUOTES SQL هو   تمكين، بل هو أيضا المسموح به على حد تعبير   المعرفات ضمن علامات اقتباس مزدوجة

وحتى إذا كنت تستخدم backticks ومن ثم تقرر الابتعاد عن الخلية، لديك مشكلة (على الرغم ربما لديك مشاكل أكبر كثيرا أيضا)

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

وكما لتسهيل القراءة، كثير من الناس استخدام أغطية للكلمات SQL، على سبيل المثال.

SELECT some_fied, some_other_field FROM whatever WHERE id IS NULL;

إذا كنت تسأل لي backticks ينبغي دائما أن تستخدم.ولكن هناك بعض الأسباب الفريق قد يفضل عدم استخدامها.

المزايا:

  • وذلك باستخدام لهم ، لا توجد الكلمات المحجوزة أو المحرمة حرف.
  • في بعض الحالات يمكنك الحصول على المزيد من وصفي رسائل الخطأ.
  • إذا كان يمكنك تجنب الممارسات السيئة لا يهمك, ولكن...في كلمة حقيقية ، وأحيانا تكون لائقة طريقة لتجنب حقن SQL.

العيوب:

  • فهي ليست معيار عادة ليس المحمولة.ومع ذلك طالما أنك لا تستخدم backtick كجزء من معرف (وهو أسوأ الممارسات وأنا قادرة على تخيل) ، يمكنك ميناء الاستعلام الخاص بك تلقائيا عن طريق إزالة backticks.
  • إذا كان بعض من الاستعلام الخاص بك تأتي من الوصول إلى أنهم قد اقتبس الجدول الأسماء "(و ربما لا تستطيع إزالة جميع " عمياء).ومع ذلك ، خليط من backticks والتنصيص مسموح بها.
  • غبي أو برنامج أو وظيفة الفلاتر الاستفسارات الخاصة بك ، و لديه مشاكل مع backticks.ومع ذلك ، فهي جزء من ASCII لذلك هذا يعني أن البرنامج/وظيفة سيئة للغاية.

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

وانها أسهل كثيرا للبحث أكواد قاعدة لشيء في backticks. نقول لديك جدول يسمى event. grep -r "event" * قد يعود مئات النتائج. سوف grep -r "\`event\`" * العودة أي شيء ربما الرجوع قاعدة البيانات الخاصة بك.

شيء بسيط عن backtick `` هو استخدام دلالة المعرف مثل اسم قاعدة البيانات ، table_name الخ, اقتباس مفردة '', اقتباس مزدوجة "" عن سلسلة حرفية ، بينما "" استخدام الطباعة القيمة كما هو و " طباعة قيمة المتغير عقد أو في حالة أخرى طباعة النص له لديهم.

i.e 1.-> use `model`;   
    here `model` is database name not conflict with reserve keyword 'model'
2- $age = 27;
insert into `tbl_people`(`name`,`age`,`address`) values ('Ashoka','$age',"Delhi");

here i used both quote for all type of requirement. If anything not clear let me know..

وإذا كنت تستخدم بعض أسماء الحقول كما الخلية الافتراضي أو MSSQL القيم على سبيل المثال "الحالة"، لديك لاستخدام backticks ( "تحديد status من TABLE_NAME" أو "تحديد هوية من TABLE_NAME حيث status = 1"). لأن الخلية بإرجاع أخطاء أو لا يعمل الاستعلام.

والاستخدام الرئيسي من backticks ( `) في SQL هو لاستخدامها في حالات أين أنت ذاهب لدعوتهم مرة أخرى في بنود القادمة. في كل مرة أخرى فمن المستحسن استخدام علامات الاقتباس المزدوجة ( "").

وعلى سبيل المثال

SELECT CONCAT(Name, ' in ', city, ', ', statecode) AS `Publisher and Location`,
    COUNT(ISBN) AS "# Books",
    MAX(LENGTH(title)) AS "Longest Title",
    MIN(LENGTH(title)) AS "Shortest Title"
FROM Publisher JOIN Book
ON Publisher.PublisherID = Book.PublisherID WHERE INSTR(name, 'read')>0
GROUP BY `Publisher and Location`
HAVING COUNT(ISBN) > 1;

في البيان أعلاه هل ترى كيف يستخدم Publisher and Location مرة أخرى في الفقرة GROUP BY.

وبدلا من استخدام

<اقتباس فقرة>   

وGROUP BY الاسم والمدينة وstatecode

ولقد استخدمت فقط

<اقتباس فقرة>   

وGROUP BY Publisher and Location

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

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