ควรใช้อัญประกาศคู่อัญประกาศคู่และ backticks ใน MySQL เมื่อใด


633

ฉันพยายามเรียนรู้วิธีที่ดีที่สุดในการเขียนข้อความค้นหา ฉันยังเข้าใจถึงความสำคัญของการสอดคล้อง จนถึงตอนนี้ฉันได้ใช้คำพูดเดี่ยวคำพูดสองครั้งและ backticks แบบสุ่มโดยไม่ต้องคิดอะไรจริง

ตัวอย่าง:

$query = 'INSERT INTO table (id, col1, col2) VALUES (NULL, val1, val2)';

นอกจากนี้ในตัวอย่างข้างต้นพิจารณาว่าtable, col1,val1และอื่น ๆ อาจจะเป็นตัวแปร

มาตรฐานสำหรับสิ่งนี้คืออะไร? คุณทำอะไร?

ฉันได้อ่านคำตอบของคำถามที่คล้ายกันที่นี่ประมาณ 20 นาทีแล้ว แต่ดูเหมือนว่าไม่มีคำตอบที่ชัดเจนสำหรับคำถามนี้


16
โปรดทราบว่านี่เป็นคำถามที่เจาะจงมากของ MySQL SQL ทั่วไป (เช่นมาตรฐาน ISO / ANSI SQL) มีชุดที่แตกต่างกันของคำพูด: ราคาคู่มีการระบุที่คั่นเช่นและคำพูดเดียวสำหรับตัวอักษรเช่น"tablename" 'this is a some text'การย้อนกลับไม่ถูกใช้ใน SQL มาตรฐาน (หากคุณต้องการรวมเครื่องหมายคำพูดคู่ในตัวระบุให้พิมพ์สองครั้งใน"odd""tablename"ทำนองเดียวกันเครื่องหมายคำพูดเดี่ยวสองตัวเป็นตัวอักษร'Conan O''Brien')
jarlh

คำตอบ:


610

จะใช้ Backticks สำหรับตัวระบุตารางและคอลัมน์ แต่จำเป็นเฉพาะเมื่อตัวระบุเป็นคำสำคัญที่สงวนไว้ของ MySQLหรือเมื่อตัวระบุประกอบด้วยตัวอักษรช่องว่างหรือตัวอักษรที่เกินขอบเขตที่ จำกัด (ดูด้านล่าง) แนะนำให้หลีกเลี่ยงการใช้คำหลักที่สงวนไว้ เป็นตัวระบุคอลัมน์หรือตารางเมื่อเป็นไปได้หลีกเลี่ยงปัญหาการอ้างอิง

ควรใช้เครื่องหมายคำพูดเดี่ยวสำหรับค่าสตริงเช่นเดียวกับในVALUES()รายการ อัญประกาศคู่ได้รับการสนับสนุนโดย MySQL สำหรับค่าสตริงเช่นกัน แต่อัญประกาศเดี่ยวเป็นที่ยอมรับอย่างกว้างขวางมากขึ้นโดย RDBMS อื่น ๆ ดังนั้นจึงเป็นนิสัยที่ดีที่จะใช้อัญประกาศแทนการดับเบิล

MySQL ยังคาดDATEและค่าที่แท้จริงที่จะเป็นคนเดียวที่ยกมาเป็นสตริงเช่นDATETIME '2001-01-01 00:00:00'ศึกษาเอกสารวันที่และเวลาสำหรับรายละเอียดเพิ่มเติมโดยเฉพาะอย่างยิ่งทางเลือกในการใช้เครื่องหมายขีดคั่น-เป็นตัวคั่นเซ็กเมนต์ในสตริงวันที่

ดังนั้นการใช้ตัวอย่างของคุณผมจะอ้างดับเบิลสตริง PHP 'val1', 'val2'และใช้คำพูดเดียวบนค่า NULLเป็นคำหลัก MySQL และพิเศษ (ไม่) - ค่าและจึงไม่ได้ยกมา

ไม่มีตัวระบุตารางหรือคอลัมน์เหล่านี้เป็นคำที่สงวนไว้หรือใช้ประโยชน์จากอักขระที่ต้องมีการอ้างอิง แต่ฉันได้ยกมาด้วย backticks (เพิ่มเติมในภายหลัง ... )

ฟังก์ชั่นพื้นเมืองของ RDBMS (ตัวอย่างเช่นNOW()ใน MySQL) ไม่ควรอ้างถึงแม้ว่าข้อโต้แย้งของพวกเขาจะต้องอยู่ภายใต้กฎการอ้างอิงสตริงหรือตัวระบุเดียวกันที่กล่าวถึงแล้ว

Backtick (`)
ตาราง & คอลัมน์───────┬─────┬──┬──┬──┬────┬──┬────┬──┬────┬──┬ ───────┐
                      ↓↓↓↓↓↓↓↓↓↓↓↓
$ query = " INSERT INTO` table` (`id`,` col1`, `col2`,` date`, `อัพเดท ')
                       ค่า (NULL, 'val1', 'val2', '2001-01-01', NOW ()) ";
                               ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 
คำหลักที่ไม่ได้อ้างอิง─────┴┴┴┘│││││││││││
สตริงที่เสนอราคาเดี่ยว (') ───────────┴────┴──┴────┘│││││││
Single-quote (') DATE ───────────────────────────┴──────────┘││││ │
ฟังก์ชันที่ไม่มีเครื่องหมายอัญประกาศ─────────────────────────────────────────┴┴┴┴┘    

การแก้ไขตัวแปร

รูปแบบการอ้างอิงสำหรับตัวแปรจะไม่เปลี่ยนแปลงแม้ว่าคุณจะต้องการสอดแทรกตัวแปรในสตริงโดยตรงจะต้องมีการเสนอราคาซ้ำใน PHP เพียงตรวจสอบให้แน่ใจว่าคุณได้หลีกเลี่ยงตัวแปรที่จะใช้ใน SQL อย่างถูกต้อง ( แนะนำให้ใช้ API ที่สนับสนุนข้อความสั่งที่เตรียมไว้แทนเพื่อป้องกันการฉีด SQL )

// สิ่งเดียวกันกับการเปลี่ยนตัวแปรบางอย่าง
// ที่นี่ชื่อตารางตัวแปร $ table คือ backtick-quote และตัวแปร
// ในรายการ VALUES เป็นการเสนอราคาแบบเดี่ยว 
$ query = "INSERT INTO '$ table` (` id`, `col1`,` col2`, `date`) ค่า (NULL, ' $ val1 ' , ' $ val2 ' , ' $ date ' )";

งบเตรียม

เมื่อทำงานกับคำสั่งที่เตรียมไว้ให้ศึกษาเอกสารเพื่อตรวจสอบว่าต้องมีการยกระดับตัวยึดคำสั่งหรือไม่ API ที่นิยมมากที่สุดใน PHP PDO และ MySQLi คาดว่าunquotedตัวยึดตำแหน่งเช่นเดียวกับ APIs งบเตรียมมากที่สุดในภาษาอื่น ๆ :

// PDO example with named parameters, unquoted
$query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`) VALUES (:id, :col1, :col2, :date)";

// MySQLi example with ? parameters, unquoted
$query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`) VALUES (?, ?, ?, ?)";

ตัวอักษรที่ต้องการ backtick quoting ในตัวระบุ:

ตามเอกสาร MySQLคุณไม่จำเป็นต้องอ้างตัวระบุ (backtick) โดยใช้ชุดอักขระต่อไปนี้:

ASCII: [0-9,a-z,A-Z$_](ตัวอักษรละตินพื้นฐานตัวเลข 0-9, ดอลลาร์, ขีดล่าง)

คุณสามารถใช้อักขระเกินกว่าที่กำหนดไว้เป็นตัวระบุตารางหรือคอลัมน์รวมถึงช่องว่างตัวอย่างเช่น แต่จากนั้นคุณต้องอ้างอิง (backtick)


43
" แต่การเสนอราคาเดียวได้รับการยอมรับอย่างกว้างขวางมากขึ้นโดย RDBMS อื่น ๆ " - การใช้อัญประกาศเดี่ยวสำหรับตัวอักษรสตริงถูกกำหนด (และจำเป็น) โดยมาตรฐาน SQL
a_horse_with_no_name

@a_horse_with_no_name แทบไม่มีใครใช้ ANSI MySQL ('|' สำหรับ string concat - จริงเหรอ?)
คนดี

3
สิ่งนี้ไม่เป็นความจริง: "MySQL ยังคาดหวังว่าค่าตัวอักษร DATE และ DATETIME จะถูกอ้างอิงเป็นสตริงเดียวเช่น '2001-01-01 00:00:00'"
Kick_the_BUCKET

3
@evilReiko MySQL เอกสารดูเหมือนจะไม่ได้ระบุชื่อแทนอย่างชัดเจน มันจะยอมรับเดี่ยวคู่หรือ backtick สำหรับนามแฝง แต่ที่อาจได้รับผลกระทบจากโหมด ANSI SQL ที่แตกต่างกัน ฉันไม่แน่ใจว่าข้อมูลจำเพาะ SQL ต้องการสำหรับอัญประกาศ - การตั้งค่าส่วนบุคคล: เพื่อความสอดคล้องฉันอ้างอิงพวกเขาเช่นเดียวกับตัวระบุคอลัมน์ - นั่นคือฉันอาจ backtick พวกเขาหากจำเป็นหรือปล่อยพวกเขาไม่ได้ยกถ้าไม่ ฉันไม่ได้ใช้การเสนอราคาเดียวหรือสองครั้งในนามแฝง
Michael Berkowski

2
@GuneyOzsan ใช่มีช่องโหว่มาก ไม่เคยใช้ตัวแปรสำหรับชื่อตารางเว้นแต่จะได้รับการตรวจสอบความถูกต้องกับรายการชื่อตารางที่ยอมรับได้ - สร้างอาร์เรย์ของชื่อที่อนุญาตและตรวจสอบตัวแปรที่ตรงกับสิ่งที่อยู่ในรายการเพื่อให้ปลอดภัย มิฉะนั้นคุณจะไม่สามารถหลีกเลี่ยงตัวแปรชื่อตารางอย่างปลอดภัยได้
Michael Berkowski

121

มีคำพูดสองประเภทใน MySQL:

  1. ' สำหรับการล้อมตัวอักษรของสตริง
  2. ` สำหรับตัวระบุที่ล้อมรอบเช่นชื่อตารางและคอลัมน์

แล้วมี"กรณีใดเป็นกรณีพิเศษ มันอาจจะใช้สำหรับหนึ่งในวัตถุประสงค์ดังกล่าวข้างต้นได้ตลอดเวลาขึ้นอยู่กับเซิร์ฟเวอร์ของ MySQL sql_mode:

  1. โดยค่าเริ่มต้น"ตัวละครที่สามารถใช้ในการใส่สายอักขระตัวอักษรเช่นเดียวกับ'
  2. ใน ANSI_QUOTESโหมด"ตัวละครสามารถใช้เพื่อใส่ตัวระบุเช่น`

แบบสอบถามต่อไปนี้จะให้ผลลัพธ์ที่แตกต่าง (หรือข้อผิดพลาด) ขึ้นอยู่กับโหมด SQL:

SELECT "column" FROM table WHERE foo = "bar"

ANSI_QUOTES ปิดการใช้งาน

แบบสอบถามจะเลือกสตริงตัวอักษร "column"ที่คอลัมน์fooเท่ากับสตริง"bar"

เปิดใช้งาน ANSI_QUOTES

แบบสอบถามจะเลือกคอลัมน์ columnที่คอลัมน์fooเท่ากับคอลัมน์bar

เมื่อไรจะใช้อะไร

  • ฉันขอแนะนำให้คุณหลีกเลี่ยงการใช้ "เพื่อให้รหัสของคุณเป็นอิสระจากโหมด SQL
  • อ้างถึงตัวระบุเสมอเนื่องจากเป็นแนวปฏิบัติที่ดี (คำถามสองสามข้อเกี่ยวกับเรื่องนี้)

32

(มีคำตอบที่ดีด้านบนเกี่ยวกับลักษณะ SQL ของคำถามของคุณ แต่สิ่งนี้อาจเกี่ยวข้องถ้าคุณยังใหม่กับ PHP)

บางทีมันสำคัญที่จะกล่าวถึงว่า PHP จัดการกับสตริงที่ยกมาเดี่ยวและสองครั้งที่แตกต่างกัน ...

สตริงที่ยกมาเดี่ยวคือ 'ตัวอักษร' และเป็นสตริง WYSIWYG ที่สวยมาก สตริงที่มีเครื่องหมายคำพูดคู่ถูกตีความโดย PHP สำหรับการทดแทนตัวแปรที่เป็นไปได้ (backticks ใน PHP ไม่ใช่สตริงอย่างแน่นอนพวกมันจะรันคำสั่งในเชลล์และส่งคืนผลลัพธ์)

ตัวอย่าง:

$foo = "bar";
echo 'there is a $foo'; // There is a $foo
echo "there is a $foo"; // There is a bar
echo `ls -l`; // ... a directory list

23

backticks โดยทั่วไปจะใช้เพื่อระบุidentifierและรวมทั้งจะปลอดภัยจากการตั้งใจใช้คำสงวน

ตัวอย่างเช่น:

Use `database`;

ที่นี่ backticks จะช่วยให้เซิร์ฟเวอร์เข้าใจว่าdatabaseในความเป็นจริงชื่อของฐานข้อมูลไม่ใช่ตัวระบุฐานข้อมูล

สามารถทำได้เหมือนกันสำหรับชื่อตารางและชื่อเขตข้อมูล นี่เป็นนิสัยที่ดีมากถ้าคุณใส่ตัวระบุฐานข้อมูลของคุณด้วย backticks

ตรวจสอบคำตอบนี้เพื่อทำความเข้าใจเพิ่มเติมเกี่ยวกับ backticks


ตอนนี้เกี่ยวกับการเสนอราคาสองครั้งและการเสนอราคาเดี่ยว (ไมเคิลได้กล่าวถึงแล้ว)

แต่ในการกำหนดค่าคุณต้องใช้เครื่องหมายคำพูดเดี่ยวหรือคู่ ให้ดูตัวอย่างอื่น

INSERT INTO `tablename` (`id, `title`) VALUES ( NULL, title1);

ที่นี่ฉันได้จงใจลืมที่จะห่อtitle1ด้วยคำพูด ตอนนี้เซิร์ฟเวอร์จะใช้title1เป็นชื่อคอลัมน์ (เช่นตัวระบุ) ดังนั้นเพื่อระบุว่าเป็นค่าที่คุณต้องใช้ทั้งเครื่องหมายคำพูดคู่หรือคำเดี่ยว

INSERT INTO `tablename` (`id, `title`) VALUES ( NULL, 'title1');

ตอนนี้เมื่อรวมกับ PHP การเสนอราคาสองครั้งและการเสนอราคาเดี่ยวทำให้เวลาในการเขียนแบบสอบถามของคุณง่ายขึ้นมาก มาดูคำถามที่แก้ไขแล้วในคำถามของคุณ

$query = "INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')";

ตอนนี้การใช้อัญประกาศคู่ใน PHP คุณจะสร้างตัวแปร$val1และ$val2ใช้ค่าของพวกเขาเพื่อสร้างแบบสอบถามที่ถูกต้องสมบูรณ์ ชอบ

$val1 = "my value 1";
$val2 = "my value 2";
$query = "INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')";

จะทำให้

INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, 'my value 1', 'my value 2')

15

ใน MySQL, สัญลักษณ์เหล่านี้ถูกนำมาใช้เพื่อกำหนดเขตแบบสอบถาม`, ", และ'()

  1. "หรือ'จะใช้สำหรับการปิดล้อมค่าสตริงเหมือนหรือ"26-01-2014 00:00:00" '26-01-2014 00:00:00'สัญลักษณ์เหล่านี้เป็นเพียงสำหรับสตริงไม่รวมฟังก์ชั่นเช่นnow, หรือsummax

  2. ` ใช้สำหรับใส่ชื่อตารางหรือคอลัมน์เช่น select `column_name` from `table_name` where id='2'

  3. (และชิ้นส่วนที่แนบเพียงของแบบสอบถามเช่น) select `column_name` from `table_name` where (id='2' and gender='male') or name='rakesh'


13

ตัวอักษรสตริงใน MySQL และ PHP เหมือนกัน

สตริงคือลำดับของไบต์หรือตัวอักษรที่อยู่ภายในเครื่องหมายคำพูดเดี่ยว (“ '”) หรือเครื่องหมายคำพูดคู่ (“””)

ดังนั้นหากสตริงของคุณมีเครื่องหมายคำพูดเดี่ยวคุณสามารถใช้เครื่องหมายคำพูดคู่เพื่อพูดสตริงหรือถ้ามันมีเครื่องหมายคำพูดคู่คุณก็สามารถใช้เครื่องหมายคำพูดเดี่ยวเพื่ออ้างอิงสตริงได้ แต่ถ้าสตริงของคุณมีทั้งอัญประกาศเดี่ยวและอัญประกาศคู่คุณต้องหลีกเลี่ยงอัญประกาศที่ใช้ในการอ้างอิงสตริง

ส่วนใหญ่เราใช้เครื่องหมายคำพูดเดี่ยวสำหรับค่าสตริง SQL ดังนั้นเราต้องใช้เครื่องหมายคำพูดคู่สำหรับสตริง PHP

$query = "INSERT INTO table (id, col1, col2) VALUES (NULL, 'val1', 'val2')";

และคุณสามารถใช้ตัวแปรในสตริงที่มีเครื่องหมายคำพูดคู่ของ PHP:

$query = "INSERT INTO table (id, col1, col2) VALUES (NULL, '$val1', '$val2')";

แต่ถ้า$val1หรือ$val2มีคำพูดเดียวนั่นจะทำให้ SQL ของคุณผิด ดังนั้นคุณต้องหลบหนีก่อนที่มันจะถูกใช้ใน sql; นั่นคือสิ่งที่mysql_real_escape_stringมีไว้เพื่อ (แม้ว่าคำสั่งที่เตรียมไว้จะดีกว่า)


12

ด้วยการรวมกันระหว่าง PHP และ MySQL การเสนอราคาสองครั้งและการเสนอราคาเดี่ยวทำให้เวลาในการเขียนแบบสอบถามของคุณง่ายขึ้นมาก

$query = "INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')";

ตอนนี้สมมติว่าคุณกำลังใช้ตัวแปรโพสต์โดยตรงลงในแบบสอบถาม MySQL แล้วใช้วิธีนี้:

$query = "INSERT INTO `table` (`id`, `name`, `email`) VALUES (' ".$_POST['id']." ', ' ".$_POST['name']." ', ' ".$_POST['email']." ')";

นี่เป็นวิธีปฏิบัติที่ดีที่สุดสำหรับการใช้ตัวแปร PHP ใน MySQL


ดังนั้นการเสนอราคาแบบสองครั้งจึงมีความยืดหยุ่น แต่ไม่สามารถใช้เป็นตัวระบุได้
rhavendc

โปรดอย่าใช้การป้อนข้อมูลผู้ใช้ที่ไม่ใช้ค่า Escape โดยตรงในแบบสอบถามของคุณ!
jankal

@jankal มันเป็นเพียงแค่ example.I ระบุว่าถ้าคุณกำลังใช้การป้อนข้อมูลของผู้ใช้โดยตรงแล้ว n แล้ว ...........
Vipul sorathiya

@vipulsorathiya โปรดระบุคำตอบของคุณว่าควรหลีกเลี่ยงตัวแปร POST ตอนนี้คุณกำลังชี้ไปที่การใช้มันโดยตรงในการค้นหาของคุณ ไม่ดีสำหรับผู้เริ่มต้นที่ลองใช้ ...
RFLdev

12

มีคำตอบที่เป็นประโยชน์มากมายที่นี่ซึ่งโดยทั่วไปจะมีสองประเด็น

  1. BACKTICKS (`) ใช้รอบชื่อตัวระบุ
  2. QUOTES เดียว (') ใช้รอบค่า

และในฐานะ @MichaelBerkowski กล่าวว่า

จะใช้ Backticks สำหรับตัวระบุตารางและคอลัมน์ แต่จำเป็นเฉพาะเมื่อตัวระบุเป็นMySQLคำสำคัญที่สงวนไว้หรือเมื่อตัวระบุประกอบด้วยช่องว่างหรืออักขระเกินขอบเขตที่ จำกัด (ดูด้านล่าง) มักแนะนำให้หลีกเลี่ยงการใช้คำหลักที่สงวนไว้ ตัวระบุคอลัมน์หรือตารางเมื่อเป็นไปได้หลีกเลี่ยงปัญหาการอ้างถึง

มีบางกรณีที่ตัวระบุไม่สามารถเป็นคำหลักที่สงวนไว้หรือมีช่องว่างหรืออักขระเกินกว่าที่ จำกัดแต่จำเป็นต้องมี backticks รอบตัว

ตัวอย่าง

123E10เป็นชื่อตัวระบุที่ถูกต้อง แต่ยังเป็นINTEGERตัวอักษรที่ถูกต้อง

[โดยไม่ต้องลงรายละเอียดวิธีที่คุณจะได้รับชื่อตัวระบุ] สมมติว่าฉันต้องการสร้างชื่อตารางชั่วคราว 123456e6สมมติว่าผมต้องการที่จะสร้างตารางชั่วคราวชื่อ

ไม่มีข้อผิดพลาดใน backticks

DB [XXX]> create temporary table `123456e6` (`id` char (8));
Query OK, 0 rows affected (0.03 sec)

ข้อผิดพลาดเมื่อไม่ได้ใช้ backticks

DB [XXX]> create temporary table 123451e6 (`id` char (8));
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '123451e6 (`id` char (8))' at line 1

อย่างไรก็ตาม123451a6เป็นชื่อตัวระบุที่สมบูรณ์แบบ (ไม่มีการย้อนกลับ)

DB [XXX]> create temporary table 123451a6 (`id` char (8));
Query OK, 0 rows affected (0.03 sec)

นี่เป็นสิ่งที่สมบูรณ์เพราะ1234156e6ยังเป็นเลขชี้กำลัง


10

หากตาราง cols และค่าเป็นตัวแปรดังนั้นมีสองวิธี:

ด้วยอัญประกาศคู่""ของแบบสอบถามที่สมบูรณ์:

$query = "INSERT INTO $table_name (id, $col1, $col2)
                 VALUES (NULL, '$val1', '$val2')";

หรือ

 $query = "INSERT INTO ".$table_name." (id, ".$col1.", ".$col2.")
               VALUES (NULL, '".$val1."', '".$val2."')";

ด้วยคำพูดเดียว'':

$query = 'INSERT INTO '.$table_name.' (id, '.$col1.', '.$col2.')
             VALUES (NULL, '.$val1.', '.$val2.')';

ใช้หลังเห็บ ``เมื่อคอลัมน์ / ชื่อค่าคล้ายกับคำสำคัญที่สงวนไว้ของ MySQL

บันทึก:หากคุณกำลังแสดงชื่อคอลัมน์ด้วยชื่อตารางให้ใช้เครื่องหมายขีดด้านหลังดังนี้

`table_name`. `column_name` <- หมายเหตุ: แยก. ออกจากเครื่องหมายขีดหลัง


8

ควรใช้เครื่องหมายคำพูดเดี่ยวสำหรับค่าสตริงเช่นในรายการ VALUES ()

โดยทั่วไปแล้ว Backticks จะใช้เพื่อระบุตัวระบุและปลอดภัยจากการใช้คำหลักที่สงวนไว้โดยไม่ตั้งใจ

ด้วยการรวมกันระหว่าง PHP และ MySQL การเสนอราคาสองครั้งและการเสนอราคาเดี่ยวทำให้เวลาในการเขียนแบบสอบถามของคุณง่ายขึ้นมาก


4

นอกเหนือจากคำตอบทั้งหมด (อธิบายอย่างดี) แล้วยังไม่มีการกล่าวถึงต่อไปนี้และฉันเยี่ยมชมคำถาม & คำตอบนี้ค่อนข้างบ่อย

โดยสังเขป; MySQL คิดว่าคุณต้องการจะทำคณิตศาสตร์บนโต๊ะของตัวเอง / คอลัมน์และตีความขีดเช่น "อีเมล" เป็นลบe mail


ข้อจำกัดความรับผิดชอบ:ดังนั้นฉันคิดว่าฉันจะเพิ่มนี่เป็นคำตอบแบบ "FYI" สำหรับผู้ที่ยังใหม่กับการทำงานกับฐานข้อมูลและผู้ที่อาจไม่เข้าใจคำศัพท์ทางเทคนิคที่อธิบายไว้แล้ว


1

เซิร์ฟเวอร์ SQL และ MySQL, PostgreySQL, Oracle ไม่เข้าใจเครื่องหมายคำพูดคู่ (") ดังนั้นการสืบค้นของคุณควรเป็นอิสระจากเครื่องหมายคำพูดคู่ (") และควรใช้เครื่องหมายคำพูดเดี่ยว (') เท่านั้น

Back-trip (`) เป็นทางเลือกที่จะใช้ใน SQL และใช้สำหรับชื่อตารางชื่อ db และชื่อคอลัมน์

หากคุณพยายามที่จะเขียนแบบสอบถามใน back-end ของคุณเพื่อเรียก MySQL คุณสามารถใช้เครื่องหมายคำพูดคู่ (") หรือเครื่องหมายคำพูดเดี่ยว (') เพื่อกำหนดแบบสอบถามให้กับตัวแปรเช่น:

let query = "select id, name from accounts";
//Or
let query = 'select id, name from accounts';

หากมีwhereคำสั่งในแบบสอบถามของคุณและ / หรือลองinsertใช้ค่าและ / หรือupdateค่าซึ่งเป็นสตริงใช้อัญประกาศเดี่ยว (') สำหรับค่าเหล่านี้เช่น:

let querySelect = "select id, name from accounts where name = 'John'";
let queryUpdate = "update accounts set name = 'John' where id = 8";
let queryInsert = "insert into accounts(name) values('John')";

//Please not that double quotes are only to be used in assigning string to our variable not in the query
//All these below will generate error

let querySelect = 'select id, name from accounts where name = "John"';
let queryUpdate = 'update accounts set name = "John" where id = 8';
let queryInsert = 'insert into accounts(name) values("John")';

//As MySQL or any SQL doesn't understand double quotes("), these all will generate error.

หากคุณต้องการหลีกเลี่ยงความสับสนนี้เมื่อใดที่จะใช้เครื่องหมายคำพูดคู่ (") และอัญประกาศเดี่ยว (') ขอแนะนำให้ติดเครื่องหมายคำพูดเดี่ยว (') สิ่งนี้จะรวมเครื่องหมายแบ็กสแลช () เช่น:

let query = 'select is, name from accounts where name = \'John\'';

ปัญหาของเครื่องหมายอัญประกาศคู่ (") หรือเครื่องหมายอัญประกาศเดี่ยว (') เกิดขึ้นเมื่อเราต้องกำหนดค่าบางค่าแบบไดนามิกและดำเนินการเรียงข้อมูลสตริงเช่น:

let query = "select id, name from accounts where name = " + fName + " " + lName;
//This will generate error as it must be like name = 'John Smith' for SQL
//However our statement made it like name = John Smith

//In order to resolve such errors use
let query = "select id, name from accounts where name = '" + fName + " " + lName + "'";

//Or using backslash(\)
let query = 'select id, name from accounts where name = \'' + fName + ' ' + lName + '\'';

หากต้องการการกวาดล้างเพิ่มเติมให้ทำตามคำพูดใน JavaScript

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.