FiveM MariaDB SQL Syntax Error แก้อย่างไร? วิธีแก้ Error 1064 และหา Query ที่เขียนผิดจาก oxmysql
FiveM MariaDB Error 1064 คือ SQL Parse Error ที่เกิดเมื่อ MariaDB อ่านคำสั่ง SQL แล้วพบว่า Syntax ไม่ถูกต้อง โดย MariaDB กำหนด Error นี้เป็น ER_PARSE_ERROR, SQLSTATE 42000 และข้อความ Error มักบอกตำแหน่งใกล้กับจุดที่ Parser เริ่มอ่านคำสั่งต่อไม่ได้.
ตัวอย่าง:
ERROR 1064 (42000):
You have an error in your SQL syntax
หรือ:
ER_PARSE_ERROR
... near '...' at line 1
ใน FiveM ปัญหานี้มักมาจาก Resource ที่ส่ง Query ผ่าน oxmysql เช่น:
ลืม comma
ลืม quote
วงเล็บเปิด-ปิดไม่ครบ
ชื่อ Table/Column ใช้คำสงวน
เขียน WHERE ผิด
เขียน JOIN ผิด
ใช้ Placeholder ผิด
SQL จาก Script คนละ Version
นำ Syntax ของ Database อื่นมาใช้
ต่อ String SQL ผิด
oxmysql มี Debug Mode และ Debug UI สำหรับดู Queries ที่ Resources Execute รวมถึง Query Timing และ Statistics แยกตาม Resource จึงมีประโยชน์มากในการตามหา Resource ที่ส่ง SQL ผิด.
① Error 1064 คืออะไร
MariaDB ระบุ Error Code:
1064
SQLSTATE:
42000
ชื่อ Error:
ER_PARSE_ERROR
และรูปแบบข้อความ:
%s near '%s' at line %d
ดังนั้น Error 1064 หมายถึง:
MariaDB ได้รับ Query
↓
เริ่ม Parse SQL
↓
พบ Syntax ที่ไม่ถูกต้อง
↓
หยุด
↓
คืน Error 1064
นี่ต่างจาก Connection Error เพราะ FiveM เชื่อม Database ได้ไกลพอที่จะส่ง SQL ไปให้ MariaDB Parse แล้ว
② Error 1064 ไม่ใช่ Database Connection Error
ถ้าเจอ:
Access denied
Connection refused
Unknown database
เป็นปัญหาอีก Layer
แต่:
1064
ER_PARSE_ERROR
หมายถึง SQL Statement ที่ MariaDBได้รับไม่สามารถ Parse ได้ตาม Syntax ที่รองรับ.
ดังนั้นอย่าเริ่มจาก:
เปลี่ยน Password
เปลี่ยน Port
เปิด Firewall
ถ้า Error ชัดเจนว่าเป็น 1064
③ อ่านคำว่า near ให้เป็น
ตัวอย่าง:
ERROR 1064 ...
near 'WHERE identifier = ...'
at line 1
คำว่า:
near
ไม่ได้หมายความว่าจุดผิดต้องอยู่ตรงตัวอักษรแรกของข้อความที่แสดงเสมอไป
MariaDB SQL Debugging Guide ระบุว่า Error Message มักชี้ไปยังบริเวณที่ Parser เริ่มสับสน ดังนั้นควรตรวจทั้งตำแหน่งที่แสดงและ Syntax ก่อนหน้านั้นเล็กน้อย.
④ ตัวอย่างลืม comma
ผิด:
INSERT INTO `characters`
(
`identifier`
`name`
)
VALUES
(
?,
?
);
ระหว่าง:
identifier
name
ขาด:
,
ถูก:
INSERT INTO `characters`
(
`identifier`,
`name`
)
VALUES
(
?,
?
);
MariaDB จะ Parse SQL ตาม Syntax ของ Statement นั้น หาก Token ไม่อยู่ในตำแหน่งที่ถูกต้องก็สามารถเกิด Error 1064 ได้.
⑤ ตัวอย่างมี comma เกิน
ผิด:
INSERT INTO `characters`
(
`identifier`,
`name`,
)
VALUES
(
?,
?
);
จุดนี้มี:
,
ก่อน )
เกินมา
แก้เป็น:
INSERT INTO `characters`
(
`identifier`,
`name`
)
VALUES
(
?,
?
);
MariaDB SQL Debugging Guide ระบุว่า Trailing Comma เป็นหนึ่งในสิ่งที่ควรตรวจเมื่อ Error Message ไปสิ้นสุดที่ท้าย Statement.
⑥ วงเล็บเปิดแล้วไม่ปิด
ผิด:
SELECT *
FROM `characters`
WHERE `id` IN (
1,
2,
3;
ขาด:
)
MariaDB Documentation แสดงว่าจำนวน Parentheses เปิดและปิดไม่สมดุลสามารถทำให้เกิด Error 1064 และกรณีวงเล็บปิดขาด Error อาจแสดงใกล้ท้าย Statement.
ถูก:
SELECT *
FROM `characters`
WHERE `id` IN (
1,
2,
3
);
⑦ วงเล็บปิดเกินก็ Error ได้
ผิด:
SELECT *
FROM `characters`
WHERE `id` = 10);
มี:
)
เกินมา
MariaDB แสดงตัวอย่างว่า Unbalanced Parentheses ทั้งฝั่งขาดและเกินสามารถนำไปสู่ SQL Syntax Error.
⑧ ลืม Quote
ผิด:
SELECT *
FROM `characters`
WHERE `name` = 'John;
Quote:
'
เปิดแต่ไม่ปิด
MariaDB SQL Debugging Guide แนะนำให้ตรวจ Missing Closing Characters เช่น ' และ ) โดยเฉพาะเมื่อ Error ไปสิ้นสุดใกล้ท้าย Query.
ถูก:
SELECT *
FROM `characters`
WHERE `name` = 'John';
⑨ แต่ใน oxmysql ไม่ควรต่อค่าผู้เล่นเข้า SQL เอง
ไม่ควร:
local query =
"SELECT * FROM characters WHERE name = '" ..
playerName ..
"'"
ควรใช้ Parameters:
local result = MySQL.query.await(
'SELECT * FROM `characters` WHERE `name` = ?',
{
playerName
}
)
MariaDB Prepared Statements รองรับ Parameterized Execution และ oxmysql APIs ใช้ Value Placeholders สำหรับส่ง Parameters แยกจาก SQL Structure.
⑩ Parameters ช่วยอะไร
ช่วยแยก:
SQL Structure
ออกจาก:
Data Values
ตัวอย่าง:
SELECT *
FROM `characters`
WHERE `identifier` = ?;
Parameter:
license:abc123
แทนการสร้าง SQL String ใหม่จาก User Input
MariaDB Prepared Statements ถูกออกแบบสำหรับ Parameterized Queries และเป็นแนวทางสำคัญด้านการ Execute Queries อย่างปลอดภัยและมีประสิทธิภาพ.
⑪ Placeholder ของ oxmysql ต้องใช้ให้ถูก
Official oxmysql prepare Documentation ปัจจุบันระบุว่าใช้:
?
เป็น Value Placeholder และไม่รองรับ ?? Column Placeholder หรือ Named Placeholders ใน prepare; การใช้รูปแบบที่ไม่รองรับจะทำให้เกิด Error.
ตัวอย่างที่ควรใช้:
MySQL.prepare.await(
'SELECT * FROM `characters` WHERE `identifier` = ?',
{
identifier
}
)
⑫ อย่าใช้ ? แทนชื่อ Table แบบธรรมดา
แนวคิด:
SELECT *
FROM ?
WHERE `id` = ?;
ไม่ควรสมมติว่า Value Placeholder ใช้แทน SQL Identifier เช่นชื่อ Table/Column ได้เหมือนค่าข้อมูล
Parameter Binding กับ SQL Identifiers เป็นคนละเรื่อง และ oxmysql prepare Documentation ปัจจุบันระบุข้อจำกัดของ Placeholder ที่รองรับ.
⑬ Prepared Statement ช่วยตรวจ Syntax ได้
MariaDB ระบุว่าเมื่อ PREPARE Statement ได้รับ SQL ที่มี Syntax Error การ PREPARE จะล้มเหลว จึงสามารถใช้เป็นวิธีตรวจว่า Statement นั้น Parse ได้หรือไม่ในบาง Workflow.
แนวคิด:
SQL
↓
PREPARE
↓
Syntax ถูก?
├─ YES → เตรียม Statement
└─ NO → Error
⑭ SQL Syntax ต้องตรง MariaDB Version
Error Message 1064 เองมักระบุให้ตรวจ Manual ที่ตรงกับ MariaDB Server Version เพราะ Syntax/Features บางอย่างอาจแตกต่างตาม Version หรือ SQL Mode.
ดังนั้นถ้า Copy SQL มาจาก:
MySQL Version อื่น
PostgreSQL
SQL Server
Oracle
อย่าสมมติว่าจะใช้กับ MariaDB ได้ทันที
⑮ Syntax ของ Database อื่นอาจใช้ไม่ได้
ตัวอย่าง Database Engines สามารถแตกต่างกันในเรื่อง:
Data Types
Functions
Quoting
DDL
Upsert Syntax
Generated Columns
JSON Functions
MariaDB มี SQL Statement Reference ของตัวเองสำหรับตรวจ Syntax ที่รองรับใน Server Version ปัจจุบัน.
⑯ Reserved Word ทำให้ Error ได้
MariaDB Documentation แสดงตัวอย่างคำบางคำที่ Parser ตีความเป็น Keyword และเมื่อนำมาใช้เป็น Identifier โดยไม่ Quote สามารถทำให้เกิด Error 1064; การใช้ Backticks สามารถช่วยระบุว่าเป็น Identifier ได้ในกรณีที่รองรับ.
ตัวอย่าง:
CREATE TABLE `accessible` (
`id` INT
);
ถ้าชื่อ Table หรือ Column เสี่ยงชน Reserved Word ควรตรวจ Documentation และใช้ชื่อที่ชัดเจน
⑰ Backtick กับ Single Quote ต่างกัน
โดยทั่วไป:
`table_name`
`column_name`
ใช้กับ SQL Identifiers
ส่วน:
'text value'
ใช้กับ String Literal
อย่าเขียน:
SELECT 'name'
FROM 'characters';
แล้วคิดว่า 'characters' คือ Table Identifier
ควรเป็น:
SELECT `name`
FROM `characters`;
Syntax ที่ถูกต้องต้องอิง SQL Statement Rules ของ MariaDB.
⑱ Double Quote ต้องระวัง SQL_MODE
MariaDB Documentation แสดงตัวอย่างว่า Behavior ของ Double Quotes สามารถแตกต่างตาม SQL_MODE เช่น ANSI_QUOTES.
ดังนั้น Code:
SELECT "column"
FROM "table";
อาจไม่ได้หมายความอย่างที่ Developer คิดในทุก Configuration
สำหรับ Resource ทั่วไปใช้:
`identifier`
กับ Table/Column และ Parameters สำหรับ Values จะชัดกว่า
⑲ SQL_MODE มีผลกับ Syntax
MariaDB มี SQL_MODE ที่สามารถเปลี่ยนพฤติกรรมของ Parser และ Compatibility บางส่วนได้.
ดังนั้น Script ที่ทำงานบน Server A แต่ Error บน Server B อาจต้องตรวจ:
SELECT @@sql_mode;
นอกจากตรวจ MariaDB Version
⑳ อย่าเปลี่ยน SQL_MODE เพียงเพื่อให้ Query พังๆ ผ่าน
ถ้า Query:
Syntax ผิดจริง
วิธีที่ดีกว่าคือแก้ SQL ให้ตรงกับ MariaDB Version/Mode ที่ Serverตั้งใจใช้
การเปลี่ยน SQL Mode ระดับ Server อาจกระทบ Resources อื่นทั้งระบบ จึงไม่ควรทำเพื่อแก้ Query เดียวโดยไม่วิเคราะห์ผลกระทบ
㉑ WHERE ขาด Operator
ผิด:
SELECT *
FROM `characters`
WHERE `identifier` ?;
ถูก:
SELECT *
FROM `characters`
WHERE `identifier` = ?;
MariaDB Parser ต้องได้รับ Expression ที่ถูกต้องตาม Statement Syntax.
㉒ AND / OR วางผิดตำแหน่ง
ผิด:
SELECT *
FROM `characters`
WHERE
AND `identifier` = ?;
หรือ:
SELECT *
FROM `characters`
WHERE `identifier` = ?
AND;
ถูก:
SELECT *
FROM `characters`
WHERE `identifier` = ?
AND `status` = ?;
เมื่อ Parser เจอ Logical Operator แต่ไม่มี Expression ครบตาม Syntax ก็สามารถนำไปสู่ Error 1064.
㉓ UPDATE ลืม SET
ผิด:
UPDATE `characters`
`status` = ?
WHERE `id` = ?;
ถูก:
UPDATE `characters`
SET `status` = ?
WHERE `id` = ?;
MariaDB SQL Reference แยก Syntax ของ DML Statements เช่น UPDATE, INSERT, DELETE อย่างชัดเจน.
㉔ UPDATE มี comma เกิน
ผิด:
UPDATE `characters`
SET
`status` = ?,
`last_seen` = ?,
WHERE `id` = ?;
ก่อน:
WHERE
มี Comma เกิน
ถูก:
UPDATE `characters`
SET
`status` = ?,
`last_seen` = ?
WHERE `id` = ?;
นี่เป็นหนึ่งใน Pattern ที่ควรตรวจเร็วที่สุดเมื่อ Error อยู่ใกล้ WHERE
㉕ INSERT จำนวน Column กับ VALUES ไม่ตรง
ถ้า Column Count กับ Values Count ไม่ตรง MariaDB มี Error เฉพาะ เช่น Error 1136 ในบางบริบท ไม่ใช่ทุกกรณีจะเป็น 1064.
ตัวอย่าง:
INSERT INTO `characters`
(
`identifier`,
`name`
)
VALUES
(
?
);
ดังนั้นต้องอ่าน Error Code จริง ไม่ควรเหมารวมว่า SQL ทุก Error คือ 1064
㉖ Query ว่างเป็น Error คนละ Code
MariaDB Error Reference ระบุว่า:
1065
คือ:
Query was empty
ส่วน:
1064
คือ Parse Error.
ดังนั้นถ้า Resourceสร้าง:
local query = ''
ปัญหาอาจเป็น 1065 ไม่ใช่ 1064
㉗ Unknown Column ก็คนละ Error
MariaDB Error List ระบุ:
1054
Unknown column
แยกจาก:
1064
Parse error
ดังนั้น:
SELECT `missing_column`
FROM `characters`;
ถ้า SQL Syntax ถูก แต่ Column ไม่มี ปัญหาหลักคือ Schema/Column ไม่ตรง ไม่ใช่ Syntax
㉘ Duplicate Entry ก็คนละ Error
จากบทความก่อน:
1062
Duplicate entry
เป็น Constraint Error
ขณะที่:
1064
เป็น Syntax Parse Error.
อย่าพยายามแก้ Error 1064 ด้วยการลบ UNIQUE KEY
㉙ Error 1149 เกี่ยวอะไร
MariaDB ยังมี Error 1149 ที่เป็น Syntax Error อีก Error Code หนึ่ง แต่ Documentation ปัจจุบันแสดงตัวอย่าง Error Context ที่สัมพันธ์กับ SQL Syntax และบางตัวอย่างอาจออกเป็น Error 1064 ตาม Statement/Parser Context.
ดังนั้นควรอ่าน:
Error Code
SQLSTATE
ข้อความเต็ม
ทุกครั้ง
㉚ วิธีหา Resource ที่ส่ง Query ผิด
เปิด oxmysql Debug:
set mysql_debug true
Official oxmysql Documentation ระบุว่าเมื่อเปิด Debug Queries จะถูก Print ใน Server Console และสามารถจำกัดเฉพาะรายชื่อ Resources ได้.
ตัวอย่างจำกัด:
set mysql_debug [
"my_resource"
]
ช่วยไม่ให้ Console เต็มไปด้วย Queries จากทั้ง Server
㉛ oxmysql Debug UI ช่วยอะไร
Debug UI สามารถแสดง:
Queries ที่ถูก Execute
Query Response Time
Statistics ต่อ Resource
และ Official Documentation แนะนำให้ใช้ใน Development หรือ Server ที่มี Player Count ต่ำ โดย Server ใหญ่ควรพิจารณา Database Logging แทน.
จึงเหมาะกับการจับ:
Resource ไหน
↓
ส่ง Query อะไร
↓
ก่อน Error 1064
㉜ อย่าดูแค่ชื่อ Resource
ต้องดูทั้ง:
Resource
SQL
Parameters
Error
Timestamp
ตัวอย่าง:
resource_character
↓
UPDATE characters ...
↓
Parameter 1 ...
↓
1064
เมื่อมีข้อมูลครบจะย้อน Code ได้ง่ายกว่าดู Console Error บรรทัดเดียว
㉝ Query ที่ Log ออกมาให้ทดสอบแยก
เมื่อได้ SQL ที่พัง ให้ทดสอบบน:
Development Database
หรือ
Staging Database
ก่อน Production
MariaDB มี SQL Reference ครบสำหรับตรวจ Syntax ของ Statements และ PREPARE จะ Fail หาก Statement มี Syntax Error.
㉞ อย่าทดสอบ DELETE / UPDATE อันตรายบน Production
ถ้า Query ที่พังคือ:
DELETE FROM ...
หรือ:
UPDATE ...
อย่านำไปรันทดลองบน Production แบบไม่จำกัด WHERE
ให้ใช้:
Backup
Test Database
Transaction ตามความเหมาะสม
ก่อนเสมอ
Syntax Debug ไม่ควรทำให้ข้อมูลจริงเสีย
㉟ Error 1064 หลัง Update Script
ตรวจ 4 อย่าง:
① Resource Code Version
② SQL Migration Version
③ MariaDB Version
④ SQL_MODE
Script รุ่นใหม่อาจใช้ Syntax ที่ Database Environment เก่าไม่รองรับ หรือ Migration/Resource Files อาจมาจากคนละ Release
MariaDB ระบุให้ตรวจ Syntax กับ Manual ที่ตรง Server Version เมื่อเจอ Error 1064.
㊱ Error 1064 หลัง Downgrade MariaDB
ถ้า Resource ใช้ Feature/Syntax จาก MariaDB Version ใหม่กว่า แล้ว Database ถูก Downgrade Query อาจ Parse ไม่ได้
จึงควรตรวจ:
SELECT VERSION();
แล้วเทียบกับ Documentation ของ Syntax ที่ Resource ใช้
อย่าแก้ SQL แบบสุ่มจน Resource ทำงานบางส่วนแต่ Data Model ผิด
㊲ Error 1064 หลังย้าย Hosting
Server ใหม่อาจมี:
MariaDB Version ต่าง
SQL_MODE ต่าง
Configuration ต่าง
แม้ Database Data จะเหมือนเดิม
จึงควรเก็บ:
Old Version
New Version
Old SQL_MODE
New SQL_MODE
เพื่อเปรียบเทียบ
㊳ Error 1064 หลัง Import Dump
MariaDB mariadb-dump สร้าง SQL Statements สำหรับสร้าง Database/Tables และ Data เพื่อใช้ Backup หรือ Transfer.
ถ้า Dump จาก Environment หนึ่ง Import ไปอีก Environment แล้วขึ้น 1064 ให้ตรวจ:
MariaDB/MySQL Compatibility
Dump Version
SQL_MODE
Syntax/Feature
ไฟล์ Dump เสียหรือถูกตัด
อย่าคิดทันทีว่า Database Data เสีย
㊴ Dump File ถูกตัดกลางก็สร้าง Syntax Error ได้
ถ้า SQL File จบระหว่าง:
INSERT INTO ...
VALUES (
Parser จะถึงท้าย Statement ทั้งที่ยังรอ Tokens เพิ่ม
MariaDB SQL Debugging Guide ระบุว่า Error near '' at line 1 สามารถหมายถึง Parser ไปถึงท้าย Statement ขณะที่ยังรอ Quote, Parenthesis หรือ Clause ที่ขาดอยู่.
ดังนั้นตรวจไฟล์ว่า Complete ด้วย
㊵ near '' at line 1 หมายถึงอะไร
ตัวอย่าง:
near '' at line 1
มักทำให้คิดว่า Error ไม่มีจุดบอก
แต่ MariaDB Guide อธิบายว่า Empty near '' มักหมายถึง Parser ไปถึง ท้าย Statement แล้วยังต้องการ Syntax เพิ่ม.
ให้ตรวจ:
Quote ไม่ปิด
) ไม่ครบ
Clause ไม่ครบ
Trailing comma
ก่อน
㊶ SQL หลายบรรทัด Error line ไหน
Error Message สามารถระบุ:
at line N
ซึ่งหมายถึง Line ใน SQL Statement ที่ Parserกำลังวิเคราะห์ ไม่จำเป็นต้องตรงกับเลขบรรทัดของ:
server.lua
ดังนั้นต้องแยก:
SQL line
กับ:
Lua file line
ออกจากกัน
㊷ Lua Syntax Error กับ SQL Syntax Error ต่างกัน
Lua Error
Resource อาจขึ้น:
unexpected symbol
attempt to ...
และ Query อาจยังไม่ถูกส่ง Database
SQL Error 1064
Lua ทำงานไกลพอที่จะส่ง SQL ให้ MariaDB แล้ว แต่ MariaDB Parse SQL ไม่ผ่าน.
ต้อง Debug คนละ Layer
㊸ fxmanifest ไม่เกี่ยวโดยตรงกับ Error 1064
fxmanifest.lua ผิดอาจทำ Resource Start ไม่ได้ แต่หาก Console แสดง MariaDB Error 1064 จุดหลักคือ SQL Statement ที่ถูกส่ง Database
อย่าแก้ Resource Manifest หาก Error Stack ชี้ชัดว่าเป็น SQL Parse Error
㊹ Placeholder Count ผิดต้องอ่าน Error จริง
เช่น:
UPDATE `characters`
SET `name` = ?
WHERE `id` = ?;
แต่ Parameters มีเพียง:
{
name
}
ปัญหาอาจเกิดที่ Driver/Binding Layer ไม่จำเป็นต้องออกเป็น Error 1064 เสมอ
ดังนั้น Debug:
SQL
+
Parameters
+
Driver Error
พร้อมกัน
㊺ oxmysql prepare ใช้ ? เท่านั้นในเอกสารปัจจุบัน
Official prepare Documentation ระบุชัดว่า:
? value placeholders
ใช้ได้ แต่:
?? column placeholders
named placeholders
จะ Error ใน API นี้.
ถ้า Script เก่าจาก Library อื่นใช้:
@identifier
หรือรูปแบบ Placeholder ต่างออกไป ต้องตรวจ API ที่ใช้จริง
㊻ Script แปลงจาก mysql-async มา oxmysql ต้องระวัง
Database APIs แต่ละตัวอาจใช้:
Function Name
Parameter Style
Return Values
Placeholder Syntax
ต่างกัน
ดังนั้น Migration Script ต้องเปลี่ยนตาม oxmysql Documentation ไม่ใช่เปลี่ยนเพียงชื่อ Resource
Official oxmysql Documentation ระบุ Configuration และ Query APIs ของตัวเองโดยเฉพาะ.
㊼ SQL Query ที่ต่อจาก Config ต้องระวัง
ตัวอย่าง:
local tableName = Config.Table
local query =
'SELECT * FROM ' ..
tableName ..
' WHERE identifier = ?'
ถ้า Config เป็น:
characters-old
Query อาจต้อง Quote Identifier อย่างเหมาะสม หรือดีกว่านั้นควรจำกัด Table Names เป็นค่าที่ Developerกำหนด ไม่ใช่ User Input
Dynamic SQL Structure ซับซ้อนกว่า Parameterized Values และควรหลีกเลี่ยงเมื่อไม่จำเป็น
㊽ อย่ารับ SQL จาก Client
ไม่ควรออกแบบ:
Client
↓
ส่ง SQL string
↓
Server
↓
MySQL.query
Client ควรส่งเพียง Data ที่ Server ต้อง Validate
จากนั้น Server เลือก Query ที่กำหนดไว้ล่วงหน้า
Prepared/Parameterized Queries ช่วยแยก Values ออกจาก SQL Statement Structure.
㊾ Dynamic ORDER BY ต้องระวัง
Value Placeholder ไม่ควรถูกใช้แบบสุ่มแทน SQL Keywords/Identifiers เช่น:
ASC
DESC
column_name
ถ้าต้อง Dynamic Sort ให้ Server Whitelist Options:
local allowedSort = {
newest = '`created_at` DESC',
oldest = '`created_at` ASC'
}
แล้วเลือกจากค่าที่กำหนดไว้
ไม่ควรนำ Input จาก Client มาต่อเป็น SQL Structure โดยตรง
㊿ Dynamic Table Name ต้อง Whitelist
ถ้ามี Tables:
characters
vehicles
profiles
ให้ Server Mapping:
local tables = {
character = '`characters`',
vehicle = '`vehicles`',
profile = '`profiles`'
}
แล้วเลือกจาก Key ที่อนุญาต
อย่าให้ Client ส่ง:
tableName
แล้วนำมาต่อ Query ตรงๆ
51. SQL Comment ทำ Syntax พังได้
MariaDB มี Comment Syntax หลายรูปแบบ และ Documentation แสดงตัวอย่างว่า Comment รูปแบบ/เวอร์ชันที่เขียนผิดสามารถนำไปสู่ Error 1064 ได้.
ถ้า Import SQL จาก Plugin/Script แล้ว Error ใกล้ Comment ให้ตรวจว่า:
Comment Syntax
Versioned Comment
Closing Marker
Semicolon
ครบหรือไม่
52. Semicolon เป็นปัญหาไหม
Semicolon ใช้เป็น Statement Delimiter ใน SQL Clients หลาย Context แต่ Driver APIs มักส่ง SQL Statement เป็น String อยู่แล้ว
อย่าใส่:
;
;
หรือหลาย Statements ต่อกันโดยไม่รู้ว่า Driver/API รองรับ Multiple Statements หรือไม่
ใช้หนึ่ง Query ต่อ API Call ตามรูปแบบที่ oxmysql Documentation แสดง เว้นแต่ API นั้นระบุรองรับรูปแบบอื่นชัดเจน.
53. วิธี Debug Error 1064 แบบเร็วที่สุด
ใช้ลำดับนี้:
① Copy Error 1064 เต็มบรรทัด
② ดู near '...'
③ ดู at line N
④ เปิด mysql_debug
⑤ หา Resource
⑥ Copy SQL
⑦ Copy Parameters
⑧ ตรวจ comma / quote / parentheses
⑨ ตรวจ Placeholder
⑩ ตรวจ MariaDB Version / SQL_MODE
⑪ Test ใน Staging
⑫ แก้ Resource
MariaDB แนะนำให้ตรวจ Query รอบตำแหน่งที่ Parser ชี้ และ oxmysql Debug สามารถแสดง Queries ที่ Resources Execute ได้.
54. Checklist Syntax Error FiveM
ก่อนแก้ให้ตรวจ:
Error Code เป็น
1064จริงหรือไม่SQLSTATE เป็น
42000หรือไม่nearแสดงอะไรError อยู่
lineไหนQuery มาจาก Resource ไหน
Query เต็มคืออะไร
Parameters คืออะไร
Comma ขาดหรือเกินหรือไม่
Quote เปิด-ปิดครบหรือไม่
Parentheses ครบหรือไม่
WHERE ถูกหรือไม่
SET อยู่ครบหรือไม่
AND/OR อยู่ถูกหรือไม่
Table Name ถูกหรือไม่
Column Name ถูกหรือไม่
Reserved Word หรือไม่
Backtick ใช้ถูกหรือไม่
Placeholder ตรงกับ oxmysql API หรือไม่
Parameter Count ถูกหรือไม่
SQL มาจาก Database Engine อื่นหรือไม่
MariaDB Version รองรับ Syntax หรือไม่
SQL_MODE ต่างจาก Server เดิมหรือไม่
Resource Version ถูกหรือไม่
Migration Version ตรงหรือไม่
SQL File ถูกตัดหรือเสียหรือไม่
Dump มาจาก Version อื่นหรือไม่
Comment Syntax ถูกหรือไม่
Dynamic SQL ถูกต่อผิดหรือไม่
Debug บน Staging แล้วหรือไม่
Backup ก่อนทดสอบ Write Query แล้วหรือไม่
ตาราง Error ที่ไม่ควรสับสน
| Error | ความหมาย |
|---|---|
1064 | SQL Parse/Syntax Error |
1065 | Query was empty |
1054 | Unknown column |
1062 | Duplicate entry |
1049 | Unknown database |
1045 | Access denied |
1452 | Foreign Key Constraint Fail |
MariaDB Error Reference แยก Error Codes เหล่านี้ตามสาเหตุอย่างชัดเจน.
FiveM Error 1064 แก้อย่างไร
เริ่มจาก Error Message:
near '...'
at line ...
แล้วตรวจ Syntax รอบตำแหน่งนั้นและก่อนหน้านั้นเล็กน้อย
MariaDB SQL Debugging Guide ระบุว่า Parser มักรายงานจุดที่มันเริ่มไม่สามารถตีความ Query ต่อได้ ไม่จำเป็นต้องเป็นตำแหน่งแรกที่ Developerพิมพ์ผิด.
จากนั้นเปิด:
set mysql_debug true
เพื่อดู Query ที่ Resource ส่งจริงผ่าน oxmysql.
FiveM You Have an Error in Your SQL Syntax คืออะไร
เป็นข้อความทั่วไปของ SQL Parser เมื่อ Query ไม่ตรง Syntax ที่ MariaDBรองรับ
Error 1064 คือ ER_PARSE_ERROR และใช้ SQLSTATE 42000.
FiveM Error 1064 near '' at line 1 คืออะไร
MariaDB อธิบายว่า Empty:
near ''
มักหมายถึง Parser ไปถึงท้าย Statement แต่ยังรอ Syntax เพิ่ม
ตรวจ:
'
"
)
comma
clause
ที่อาจยังไม่ครบ.
FiveM Error 1064 หลัง Update Script แก้อย่างไร
ตรวจ:
Resource Version
Migration
MariaDB Version
SQL_MODE
ก่อน เพราะ Error 1064 สามารถเกิดจาก SQL Syntax ที่ Environment ปัจจุบันไม่รองรับหรือ Query ที่เปลี่ยนไปหลัง Update.
FiveM Error 1064 หลัง Import SQL แก้อย่างไร
ตรวจบรรทัดใกล้ Error แล้วดูว่า SQL Dump:
ครบหรือไม่
ถูกตัดหรือไม่
มาจาก MariaDB/MySQL Version ไหน
มี Syntax เฉพาะ Version หรือไม่
mariadb-dump สร้าง SQL Statements สำหรับ Schema และ Data ดังนั้น Compatibility ของ SQL ที่นำเข้าเป็นสิ่งที่ต้องตรวจ.
FiveM oxmysql ดู Query ที่ Error ยังไง
เปิด:
set mysql_debug true
Official oxmysql Documentation ระบุว่า Queries จะถูก Print ใน Server Console และสามารถจำกัดรายชื่อ Resources ที่ต้อง Debug ได้.
หรือใช้ Debug UI เพื่อดู Queries และ Statistics ต่อ Resourceใน Development Environment.
FiveM oxmysql ใช้ Placeholder แบบไหน
สำหรับ prepare Documentation ปัจจุบัน oxmysql ระบุให้ใช้:
?
สำหรับ Value Placeholders และระบุว่า Column Placeholder ?? และ Named Placeholders จะ Error ใน API นี้.
FiveM SQL Syntax Error เกิดจาก Parameters ได้ไหม
อาจเกี่ยวกับ Parameter/Placeholder Configuration หรือ Dynamic Query Construction แต่ต้องอ่าน Driver Error จริง
ถ้า SQL Structure เองไม่ถูก MariaDBจะคืน Parse Error 1064 ส่วน Error จาก Parameter Binding อาจเกิดก่อน SQL ไปถึง Parser หรือออก Error ประเภทอื่น
จึงต้องเก็บทั้ง:
SQL
Parameters
Error Stack
FiveM SQL Syntax Error ใช้ PREPARE ตรวจได้ไหม
MariaDB ระบุว่า PREPARE จะ Fail ถ้า Statement มี Syntax Error จึงสามารถใช้ตรวจ Validity ของ SQL Statement ในบาง Development/Diagnostic Workflow ได้.
FiveM เปลี่ยน MariaDB Version แล้ว Error 1064 ได้ไหม
ได้หาก Resource ใช้ Syntax/Feature ที่ Version ใหม่หรือเก่ากว่าไม่รองรับเหมือนกัน
MariaDB Error Message เองแนะนำให้ตรวจ Manual ที่ตรงกับ Server Version.
FiveM SQL_MODE ทำให้ Error 1064 ได้ไหม
ได้ในบาง Syntax/Compatibility Context เพราะ SQL_MODE มีผลต่อวิธีที่ MariaDBตีความ SQL บางรูปแบบ เช่น Quoting และ Compatibility Modes.
FAQ FiveM MariaDB Error 1064
Error 1064 คืออะไร
คือ MariaDB ER_PARSE_ERROR หรือ SQL Syntax Parse Error ใช้ SQLSTATE 42000.
near '...' at line 1 หมายถึงอะไร
หมายถึง Parser เริ่มไม่สามารถตีความ SQL ต่อได้ใกล้ตำแหน่งนั้น แต่จุดผิดจริงอาจอยู่ก่อนหน้าเล็กน้อย.
near '' หมายถึงอะไร
มักหมายถึง Parser ไปถึงท้าย Query ขณะที่ยังรอ Syntax เช่น Quote หรือ Parenthesis ที่ยังไม่ปิด.
วิธีดู Query ที่ oxmysql ส่งจริงทำอย่างไร
ใช้ set mysql_debug true หรือ Debug UI ของ oxmysql ใน Environment ที่เหมาะสม.
Error 1064 กับ Unknown Column เหมือนกันไหม
ไม่ 1064 เป็น Parse Error ส่วน 1054 คือ Unknown Column.
Error 1064 กับ Duplicate Entry เหมือนกันไหม
ไม่ Duplicate Entry คือ Error 1062.
oxmysql prepare ใช้ @name Placeholder ได้ไหม
Official prepare Documentation ปัจจุบันระบุให้ใช้ ? Value Placeholder และ Named Placeholders จะ Error ใน API นี้.
Query จาก MySQL ใช้กับ MariaDB ได้เสมอไหม
ไม่ควรสมมติแบบนั้น แม้เข้ากันได้หลายส่วน แต่ Syntax/Version/SQL Mode สามารถแตกต่างกันได้ จึงควรตรวจ MariaDB Documentation ที่ตรงกับ Server Version.
Error หลังย้าย VPS เกิดจากอะไรได้
ควรเทียบ MariaDB Version, SQL Mode และ Resource Version ระหว่างเครื่องเก่ากับเครื่องใหม่
Error 1064 หลัง Import Backup หมายความว่า Backup เสียไหม
ไม่จำเป็น อาจเป็น SQL Compatibility, Statement ถูกตัด หรือ Syntax ที่ Environment ใหม่ไม่รองรับ ต้องตรวจตำแหน่ง Error ก่อน.
เปิด mysql_debug Production ตลอดดีไหม
Official oxmysql แนะนำ Debug UI สำหรับ Development หรือ Server Player Count ต่ำ และ Server ใหญ่ควรใช้ Logging ที่เหมาะสมแทน.
Error 1064 แก้ด้วย Restart MariaDB ได้ไหม
โดยทั่วไป Restart ไม่แก้ SQL Syntax ที่เขียนผิด เพราะ Query เดิมจะถูกส่งใหม่และ Parser ก็จะเจอ Syntax เดิมอีก
ประเด็นสำคัญ
เมื่อ FiveM Console ขึ้น:
ERROR 1064
You have an error in your SQL syntax
ให้ใช้สูตร:
1064
↓
อ่าน near '...'
↓
ดู line
↓
เปิด oxmysql debug
↓
หา Resource
↓
Copy SQL + Parameters
↓
ตรวจ comma
↓
ตรวจ quotes
↓
ตรวจ parentheses
↓
ตรวจ placeholders
↓
ตรวจ MariaDB Version / SQL_MODE
↓
แก้ Query
MariaDB ระบุ Error 1064 เป็น ER_PARSE_ERROR และ SQL Debugging Guide แนะนำให้เริ่มจากตำแหน่งที่ Parser บอกว่าเริ่มสับสน รวมถึงตรวจ Missing Quote, Parenthesis และ Trailing Comma หาก Error อยู่ท้าย Statement.
ฝั่ง FiveM ให้ใช้ oxmysql Debug เพื่อดู Query ที่ Resource ส่งจริง แทนการเดาจาก Source Code เพียงอย่างเดียว เพราะ Runtime Values หรือ Dynamic Query Construction อาจทำให้ SQL สุดท้ายต่างจากที่ Developerคิดไว้.
ถ้าใช้ MySQL.prepare ต้องจำว่า Official Documentation ปัจจุบันกำหนด ? เป็น Value Placeholder และระบุว่า ?? Column Placeholders กับ Named Placeholders จะ Error ใน API นี้.
สำหรับผู้อ่าน comsiam ให้จำสูตร “1064 = อ่าน Query ที่ MariaDB ได้รับจริง ไม่ใช่เดาจากโค้ด” และ comsiam แนะนำให้แก้ Syntax ต้นเหตุแทนการเปลี่ยน Database Settings แบบสุ่ม เพราะ Error 1064 ส่วนใหญ่มักหาเจอเร็วเมื่อมีข้อมูลครบ 4 อย่างคือ Resource + SQL + Parameters + Error Position
Comments
Post a Comment