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

ก่อนแก้ให้ตรวจ:

  1. Error Code เป็น 1064 จริงหรือไม่

  2. SQLSTATE เป็น 42000 หรือไม่

  3. near แสดงอะไร

  4. Error อยู่ line ไหน

  5. Query มาจาก Resource ไหน

  6. Query เต็มคืออะไร

  7. Parameters คืออะไร

  8. Comma ขาดหรือเกินหรือไม่

  9. Quote เปิด-ปิดครบหรือไม่

  10. Parentheses ครบหรือไม่

  11. WHERE ถูกหรือไม่

  12. SET อยู่ครบหรือไม่

  13. AND/OR อยู่ถูกหรือไม่

  14. Table Name ถูกหรือไม่

  15. Column Name ถูกหรือไม่

  16. Reserved Word หรือไม่

  17. Backtick ใช้ถูกหรือไม่

  18. Placeholder ตรงกับ oxmysql API หรือไม่

  19. Parameter Count ถูกหรือไม่

  20. SQL มาจาก Database Engine อื่นหรือไม่

  21. MariaDB Version รองรับ Syntax หรือไม่

  22. SQL_MODE ต่างจาก Server เดิมหรือไม่

  23. Resource Version ถูกหรือไม่

  24. Migration Version ตรงหรือไม่

  25. SQL File ถูกตัดหรือเสียหรือไม่

  26. Dump มาจาก Version อื่นหรือไม่

  27. Comment Syntax ถูกหรือไม่

  28. Dynamic SQL ถูกต่อผิดหรือไม่

  29. Debug บน Staging แล้วหรือไม่

  30. Backup ก่อนทดสอบ Write Query แล้วหรือไม่

ตาราง Error ที่ไม่ควรสับสน

Errorความหมาย
1064SQL Parse/Syntax Error
1065Query was empty
1054Unknown column
1062Duplicate entry
1049Unknown database
1045Access denied
1452Foreign 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

Popular posts from this blog

FiveM ยังน่าเล่นไหม? Enhanced เปลี่ยน FiveM แค่ไหน

FiveM คืออะไร เล่นอย่างไร สำหรับมือใหม่ เริ่มต้นตั้งแต่ศูนย์

วิธีตั้ง Admin Permission ด้วย add_ace และ add_principal FiveM แบบละเอียด