FiveM MariaDB Unknown Column แก้อย่างไร? วิธีแก้ Error 1054 เมื่อ Resource กับ Database Schema คนละ Version

 FiveM MariaDB Unknown column คือ Error ที่เกิดเมื่อ Resource ส่ง SQL Query ไปเรียก Column ที่ MariaDB หาไม่พบใน Table หรือ Query Context นั้น โดย MariaDB กำหนด Error นี้เป็น 1054, SQLSTATE 42S22 และชื่อ ER_BAD_FIELD_ERROR พร้อมข้อความรูปแบบ Unknown column '...' in '...'.

ตัวอย่างที่อาจพบใน FiveM Console:

ERROR 1054 (42S22):
Unknown column 'citizenid' in 'field list'

หรือ:

SCRIPT ERROR: oxmysql was unable to execute a query!
Unknown column 'metadata' in 'field list'

หรือ:

Unknown column 'players.identifier' in 'where clause'

ปัญหานี้ต่างจาก Table doesn't exist เพราะกรณี Error 1054 Table อาจมีอยู่แล้ว แต่ Column ที่ SQL เรียกใช้ไม่มี ชื่อไม่ตรง หรืออยู่ผิด Table/Alias.

สาเหตุที่พบได้บ่อยใน FiveM ได้แก่:

ไม่ได้รัน Migration หลังอัปเดต Script
Resource ใหม่แต่ Database Schema เก่า
Database ใหม่แต่ Custom Script เก่า
Column ถูก Rename
Column ถูกลบ
พิมพ์ชื่อ Column ผิด
Query ใช้ชื่อ Column ของ Framework อื่น
Table Alias ผิด
Resource ต่อ Database คนละตัว
SQL ถูก Import ไม่ครบ
Parameter ถูกนำไปใช้ผิดลักษณะ
ใช้ String เป็น Identifier โดยไม่ Quote/Parameterize ให้ถูก

แนวทางแก้ที่ถูกต้องคือ:

Error 1054
↓
อ่านชื่อ Column
↓
ดูว่า Error อยู่ field list / where clause / on clause
↓
หา Resource และ Query
↓
SHOW COLUMNS
↓
SHOW CREATE TABLE
↓
ตรวจ Resource Version กับ Schema
↓
ตรวจ Migration
↓
แก้ Column หรือ Query ตาม Schema ที่ถูกต้อง

① Error 1054 คืออะไร

MariaDB ระบุ:

Error Code: 1054
SQLSTATE: 42S22
ER_BAD_FIELD_ERROR
Unknown column '%s' in '%s'

อย่างเป็นทางการ.

ตัวอย่าง:

SELECT
    `citizenid`,
    `name`
FROM `players`;

แต่ Table players จริงมีเพียง:

id
identifier
name

ไม่มี:

citizenid

MariaDB จึงไม่สามารถ Resolve ชื่อ Column นั้นได้

② Unknown Column ต่างจาก Table Doesn't Exist อย่างไร

จากบทความก่อนหน้า:

1146
Table doesn't exist

หมายถึง Table ที่ SQL อ้างถึงไม่มี

แต่:

1054
Unknown column

หมายถึง SQL ไปถึงขั้น Resolve Column แล้ว แต่ชื่อ Column ที่ระบุหาไม่พบใน Context ที่ใช้อยู่.

จำง่าย:

1146
ไม่มี Table

1054
มี Table/Query Context
แต่ไม่มี Column ที่เรียก

③ Unknown Column ต่างจาก SQL Syntax Error อย่างไร

Error:

1064
SQL Syntax Error

หมายถึง MariaDB Parse โครงสร้าง SQL ไม่ผ่าน

แต่:

1054
Unknown Column

โดยทั่วไป Query Parse ได้ไกลพอที่จะเริ่ม Resolve Identifiers แล้ว แต่ Column ที่อ้างถึงไม่ถูกต้อง.

ดังนั้นถ้า Error เป็น 1054 อย่าเริ่มจากแก้:

comma
parenthesis
semicolon

ก่อน

ให้ดูชื่อ Column ที่ MariaDBแจ้ง

④ อ่านคำว่า in field list ให้เป็น

ตัวอย่าง:

Unknown column 'citizenid' in 'field list'

มักหมายความว่า Column ถูกอ้างถึงในส่วนของรายการ Fields เช่น:

SELECT `citizenid`
FROM `players`;

หรือ:

INSERT INTO `players`
    (`citizenid`, `name`)
VALUES
    (?, ?);

หรือ:

UPDATE `players`
SET `citizenid` = ?
WHERE `id` = ?;

จุดสำคัญคือหา Query จริงก่อน

⑤ Unknown Column in WHERE clause

ตัวอย่าง:

Unknown column 'citizenid' in 'where clause'

Query อาจเป็น:

SELECT *
FROM `players`
WHERE `citizenid` = ?;

แต่ Table มี:

identifier

แทน

กรณีนี้ Resourceอาจเขียนมาสำหรับ Framework คนละตัว

⑥ Unknown Column in ON clause

ตัวอย่าง:

SELECT *
FROM `players` p
JOIN `characters` c
    ON c.`player_id` = p.`id`;

ถ้า characters ไม่มี:

player_id

ก็สามารถเกิด Unknown Column ระหว่างการ Resolve Join Condition ได้

ดังนั้นเมื่อ Errorเกี่ยวกับ Join ต้องตรวจ ทั้งสอง Tables และ Alias

⑦ วิธีตรวจ Columns ของ Table

ใช้:

SHOW COLUMNS FROM `players`;

MariaDB SHOW COLUMNS ใช้แสดงข้อมูล Columns ของ Table เช่นชื่อ Field, Type, Null, Key, Default และ Extra.

ตัวอย่างผล:

id
identifier
name
metadata
created_at

ถ้า Resource Query:

citizenid

แต่ไม่มีในรายการ ก็พบปัญหาเบื้องต้นแล้ว

⑧ ใช้ SHOW CREATE TABLE ยืนยัน Schema

ใช้:

SHOW CREATE TABLE `players`;

MariaDB ระบุว่า SHOW CREATE TABLE แสดง CREATE TABLE Statement ของ Table ปัจจุบัน จึงช่วยดู Column Definitions, Indexes และโครงสร้างจริงได้.

ตัวอย่าง:

CREATE TABLE `players` (
    `id` INT NOT NULL AUTO_INCREMENT,
    `identifier` VARCHAR(100) NOT NULL,
    `name` VARCHAR(100) NOT NULL,
    PRIMARY KEY (`id`)
);

ตรงนี้ชัดเจนว่าไม่มี:

citizenid

⑨ อย่าดู install.sql อย่างเดียว

Resource Folder อาจมี:

`citizenid` VARCHAR(50)

แต่ Production Database จริงอาจยังเป็น:

`identifier` VARCHAR(100)

เพราะ Migration ไม่ได้รัน

ดังนั้นต้องเปรียบเทียบ:

Resource SQL
vs
SHOW CREATE TABLE จริง

ไม่ใช่อ่านไฟล์ SQL แล้วสมมติว่า Databaseถูก Update ไปแล้ว

⑩ สาเหตุอันดับหนึ่ง: Migration ไม่ครบ

ตัวอย่าง:

Resource v1
ใช้ column:
identifier

Resource v2 เปลี่ยนเป็น:

citizenid

พร้อม Migration:

ALTER TABLE `players`
ADD COLUMN `citizenid` VARCHAR(50);

แต่ Admin Update เพียง Resource Folder

Database ยังไม่มี Column ใหม่

เมื่อ Resource v2 Query:

SELECT `citizenid`
FROM `players`;

จึงเกิด Error 1054

MariaDB รองรับการเพิ่ม Column ผ่าน ALTER TABLE ... ADD COLUMN.

⑪ อย่า ADD COLUMN เองก่อนหา Migration

ถ้าเห็น:

Unknown column 'citizenid'

อย่ารีบ:

ALTER TABLE `players`
ADD `citizenid` VARCHAR(50);

เพราะ Official Migration อาจต้องกำหนด:

Data Type อื่น
NOT NULL
DEFAULT
UNIQUE
INDEX
Character Set
Position
Backfill

หรืออาจไม่ได้ต้องเพิ่ม Columnเลย เพราะ Queryของ Custom Script เป็นฝ่ายผิด

⑫ Resource ใหม่กับ Database เก่า

นี่เป็น Pattern ที่พบบ่อยมาก:

Resource v4
+
Database Schema v2
=
Unknown Column

โดยเฉพาะ Script ที่ Update แล้วเพิ่มข้อมูล เช่น:

metadata
last_seen
citizenid
account_id
status
garage_id

ถ้า Migrationหลัง Versionไม่ได้รัน SQL ใหม่จะหา Columnไม่พบ

⑬ Database ใหม่แต่ Resource เก่าก็เกิดได้

กรณีกลับกัน:

Database Schema ใหม่
+
Custom Script เก่า

เช่น Schema ใหม่ Rename:

identifier
→ citizenid

แต่ Custom Script ยัง:

SELECT `identifier`
FROM `players`;

ผลก็เป็น Error 1054 ได้

ดังนั้นไม่ควรสรุปทุกครั้งว่า:

Database ต้องเพิ่ม Column

บางครั้งต้องแก้ Resource Query ให้ใช้ Columnใหม่

⑭ Rename Column เป็นสาเหตุได้

สมมติ Migration เปลี่ยน:

owner

เป็น:

identifier

Custom Resource เก่ายังทำ:

SELECT *
FROM `vehicles`
WHERE `owner` = ?;

แต่ Tableใหม่ไม่มี owner

Error:

Unknown column 'owner' in 'where clause'

MariaDB ALTER TABLE รองรับ Operations สำหรับปรับโครงสร้าง Columns รวมถึงการเปลี่ยน Columnsตาม Syntax ที่รองรับ.

⑮ อย่าเพิ่ม Column เก่ากลับเพียงเพื่อให้ Custom Script ผ่าน

ถ้า Frameworkใหม่เปลี่ยน Data Model จาก:

owner

เป็น:

citizenid

การเพิ่ม:

owner

กลับมาอีก Column อาจทำให้เกิดข้อมูลซ้ำสองแหล่ง:

owner = A
citizenid = B

และ Resources คนละตัวอ่านคนละค่า

ควร Update Custom Script ให้ใช้ Data Model ปัจจุบันถ้านั่นคือ Official Schema

⑯ Framework คนละตัวใช้ชื่อ Column ไม่เหมือนกัน

Custom Script ที่ทำมาสำหรับ Framework A อาจคาด:

citizenid

แต่ Framework B ใช้:

identifier

หรือ:

charid

ดังนั้น Error 1054 หลังติดตั้ง Script ใหม่อาจหมายถึง:

Script ไม่ Compatible กับ Framework ปัจจุบัน

ไม่ใช่ Database เสีย

⑰ อย่า Copy SQL ของ Framework อื่นมารวมกัน

ถ้า Resource Requirements บอกว่าใช้ Data Modelหนึ่ง แต่ Serverใช้ Frameworkอีกตัว การ Import SQL จากอีก Frameworkเพียงเพื่อให้ Columnปรากฏ อาจสร้าง Mixed Schema

ผลในอนาคตอาจเป็น:

Duplicate Data
Foreign Key Error
Unknown Column เพิ่ม
Required Field Error
Resource Load ผิด

ต้องเลือก Integration ที่รองรับ Frameworkจริง

⑱ วิธีค้น Column ทั้ง Database

MariaDB information_schema.COLUMNS มี Metadata ของ Columns ทุก Tables รวมถึง:

TABLE_SCHEMA
TABLE_NAME
COLUMN_NAME
DATA_TYPE
COLUMN_DEFAULT
IS_NULLABLE

ตัวอย่าง:

SELECT
    TABLE_SCHEMA,
    TABLE_NAME,
    COLUMN_NAME,
    DATA_TYPE
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
  AND COLUMN_NAME = 'citizenid';

ถ้าไม่มีผลลัพธ์ แสดงว่า Databaseปัจจุบันไม่มี Columnชื่อนี้เลย

⑲ หา Column ที่ชื่อคล้ายกัน

หาก Error:

Unknown column 'citizenid'

แต่ไม่แน่ใจว่า Schemaใช้ชื่ออะไร สามารถตรวจ:

SHOW COLUMNS FROM `players`;

แล้วดูว่าอาจมี:

identifier
citizen_id
character_id
player_id

แทน

ไม่ควร Rename หรือเพิ่ม Column จนกว่าจะรู้ว่า Resourceต้องการ Data Conceptใดจริง

⑳ ตรวจ Database ปัจจุบันด้วย

ใช้:

SELECT DATABASE();

MariaDB DATABASE() คืนชื่อ Default Database ของ Session ปัจจุบัน.

สมมติคุณเปิด phpMyAdmin Database:

fivem_prod

แล้วเห็น Column citizenid

แต่ FXServerจริงต่อ:

fivem_test

ซึ่งไม่มี Column

FiveMก็ยัง Error

㉑ Connection String ผิด Database ทำ Unknown Column ได้

Official oxmysql Documentation ระบุให้กำหนด mysql_connection_string ก่อน Resources และ Connection String มีชื่อ Database ที่ FXServer ใช้งาน.

ตัวอย่าง:

set mysql_connection_string "mysql://user:pass@localhost:3306/fivem"

ถ้า SQL Migrationถูกนำไปใช้กับ:

fivem_new

แต่ FiveMยังใช้:

fivem

Tableอาจมีเหมือนกัน แต่ Columns คนละ Version

จึงเกิด 1054 แทน 1146ได้

㉒ ทำไม Database ผิดตัวถึงเกิด 1054 แทน 1146

สมมติทั้งสอง Databaseมี Table:

players

Database A:

players
- id
- identifier

Database B:

players
- id
- identifier
- citizenid

Resourceต้องใช้ B

แต่ Connectionไป A

Tableจึงมี:

players

แต่ไม่มี:

citizenid

ผลคือ:

1054 Unknown Column

ไม่ใช่ 1146

㉓ Error หลัง Restore Database

สมมติ Resource Files ปัจจุบันเป็น v5

แต่ Restore Backupของ Databaseจาก v3

หลัง Restore:

Table ทุกตัวอยู่ครบ

จึงไม่เกิด 1146

แต่ Columns ที่เพิ่มใน v4/v5 หาย

FiveMจึงเริ่มขึ้น:

Unknown column

หลายตัว

กรณีนี้ต้อง Apply Migrations จาก Version Backupไป Versionปัจจุบันตามลำดับ

㉔ อย่า Import Fresh install.sql ทับ Production โดยไม่ตรวจ

หากมี Player Dataอยู่แล้ว:

characters
vehicles
inventory
accounts

ไม่ควรใช้ Fresh Installation SQL ซ้ำโดยอัตโนมัติ

ควรหา:

migration.sql
upgrade.sql
ALTER TABLE
release migration

ที่ตรง Version

Fresh Install Schema กับ Upgrade Schema มีวัตถุประสงค์ต่างกัน

㉕ Table มี Column แต่ Error ยังขึ้น

ถ้า:

SHOW COLUMNS FROM `players`;

เห็น:

citizenid

แต่ Consoleยังขึ้น:

Unknown column 'citizenid'

ให้ตรวจต่อ:

Database ที่ FiveMต่ออยู่
Table Alias
ชื่อ Tableจริงใน Query
Database-qualified name
Resource Queryจริง

อาจกำลังตรวจ players ใน Databaseหนึ่ง แต่ Queryจริงใช้ Tableอีกตัว

㉖ Table Alias คืออะไร

ตัวอย่าง:

SELECT
    p.`identifier`
FROM `players` AS p;

ตรงนี้:

p

คือ Alias ของ players

ถ้าเขียน:

SELECT
    x.`identifier`
FROM `players` AS p;

x ไม่มีใน Query Context

จึงเป็น Identifier Problem ที่ต้องแก้ SQL ไม่ใช่เพิ่ม Column

㉗ Join Alias ผิดเป็นสาเหตุยอดนิยมใน Custom Script

ตัวอย่าง:

SELECT
    p.`identifier`,
    c.`firstname`
FROM `players` p
JOIN `characters` c
    ON p.`character_id` = x.`id`;

แต่ไม่มี Alias:

x

ปัญหานี้อยู่ที่ Query

ไม่ใช่ Schema

㉘ Column อยู่คนละ Table

สมมติ:

players
- id
- identifier

characters
- id
- firstname
- lastname

แต่ Query:

SELECT
    p.`firstname`
FROM `players` p;

firstname อาจมีอยู่จริง แต่ อยู่ใน characters ไม่ใช่ players

ดังนั้นคำว่า Unknown Columnไม่ได้แปลว่า Columnไม่มีทั้ง Database

อาจเพียงอ้างผ่าน Table/Aliasผิด

㉙ ใช้ information_schema ตรวจตำแหน่ง Column

สามารถใช้:

SELECT
    TABLE_NAME,
    COLUMN_NAME
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
  AND COLUMN_NAME = 'firstname';

information_schema.COLUMNS มีข้อมูล Column ของแต่ละ Tableบน Server.

หากผล:

characters | firstname

แสดงว่า Queryที่ใช้:

players.firstname

ผิด Table

㉚ Unknown Column จาก Typo

ตัวอย่างง่ายๆ:

Database:

identifier

Resource Query:

identifer

ขาดตัว:

i

MariaDBไม่สามารถเดาได้ว่า Developerหมายถึง Columnใด

จึงคืน 1054

ก่อน Migrationใหญ่ ให้ตรวจ Spellingเสมอ

㉛ Column Name ตัวพิมพ์ใหญ่เล็กควรใช้ให้สม่ำเสมอ

แม้ Identifier Case Rules มีรายละเอียดต่างกันตามชนิด Identifier และ Platform แต่แนวทางที่ปลอดภัยคือให้ Schemaกับ Resourceใช้ชื่อเดียวกันทุกจุด ไม่ผสม:

CharacterID
characterId
character_id

ถ้าเป็นคนละชื่อจริง SQLก็ไม่ได้ถือว่าเป็น Columnเดียวกันโดยอัตโนมัติ

㉜ String ที่ไม่ Quote อาจถูกตีความเป็น Column

ตัวอย่างที่ผิด:

SELECT *
FROM `players`
WHERE `status` = active;

ถ้า active ถูกเขียนเป็น Bare Identifier MariaDBอาจพยายามตีความเป็นชื่อ Identifier/Column แทน String Value

รูปแบบที่เหมาะกว่า:

SELECT *
FROM `players`
WHERE `status` = ?;

แล้วส่ง:

active

ผ่าน Parameter

oxmysql ระบุว่า Placeholdersใช้ส่ง Query Parameters แยกจาก SQL และช่วย Execute Parameters อย่างปลอดภัย.

㉝ อย่าต่อ User Input เข้า SQL ตรงๆ

ไม่ควร:

local query =
    "SELECT * FROM players WHERE identifier = " ..
    identifier

ถ้า Identifierเป็น String Queryอาจกลายเป็น SQL ที่ MariaDBตีความ Identifierผิดชนิด

ควร:

MySQL.query.await(
    'SELECT * FROM `players` WHERE `identifier` = ?',
    {
        identifier
    }
)

oxmysql รองรับ Parameterized Queries และ Query API คืน Rows/Result Data ตามประเภท Statement.

㉞ Value Placeholder ไม่ใช่ Column Placeholder

oxmysql prepare Documentation ปัจจุบันระบุว่า:

?

ใช้สำหรับ Value Placeholders และ ?? Column Placeholders / Named Placeholders ไม่รองรับใน API นั้น.

ดังนั้นอย่าเขียน:

SELECT ?
FROM `players`;

แล้วหวังว่า Parameter:

identifier

จะถูกตีความเป็นชื่อ Column แบบเดียวกับ SQL Identifier

㉟ Dynamic Column Name ต้อง Whitelist

ถ้าต้อง Dynamic Sort:

name
created_at
level

อย่านำ Client Inputมาต่อ SQLโดยตรง

ใช้ Mapping:

local allowedColumns = {
    name = '`name`',
    created = '`created_at`',
    level = '`level`'
}

แล้วเลือกเฉพาะค่าที่ Serverกำหนด

ส่วน Valuesจริงยังส่งด้วย ?

㊱ Reserved Keyword ก็ต้องระวัง

MariaDB มีรายการ Keywords ผ่าน information_schema.KEYWORDS.

ถ้า Columnใช้ชื่อที่ชน Keyword หรือ SQL Parserตีความได้หลายแบบ ควรใช้ Identifier Quoting/ชื่อที่ชัดเจนตาม Schema

อย่างไรก็ตาม ถ้า Resourceและ Official Schemaใช้ชื่อเดียวกันอยู่แล้ว อย่า Rename Production Columnเพียงเพราะชื่อดูแปลกโดยไม่ตรวจ Dependencies

㊲ Error หลังเพิ่ม Custom Column

สมมติ Adminเพิ่ม:

vip_level

บน Development Database

แต่ลืมเพิ่มใน Production

Custom Resource Query:

SELECT `vip_level`
FROM `players`;

Devทำงาน

Production:

1054

ดังนั้น Custom Database Changesต้องมี Migration Scriptเหมือน Resource Changesอื่น

㊳ ห้ามแก้ Production ด้วยการจำจาก Dev

ใช้:

SHOW CREATE TABLE `players`;

จากทั้ง Dev และ Production แล้วเทียบจริง

MariaDB SHOW CREATE TABLE แสดง Definition ของ Table จึงเหมาะกับ Schema Comparison.

อย่าเดาว่า:

น่าจะเหมือนกัน

㊴ information_schema ช่วยเปรียบเทียบ Columns ได้

ตัวอย่าง:

SELECT
    COLUMN_NAME,
    COLUMN_TYPE,
    IS_NULLABLE,
    COLUMN_DEFAULT
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
  AND TABLE_NAME = 'players'
ORDER BY ORDINAL_POSITION;

MariaDB information_schema.COLUMNS มีข้อมูล Type, Default และ Nullability ของแต่ละ Column.

เหมาะกับการสร้าง Schema Checklist

㊵ Column ถูกลบโดย Migration

บางครั้ง Migrationใหม่ตั้งใจ:

DROP old_column

เพราะข้อมูลย้ายไป Tableใหม่

Custom Scriptยังอ้าง:

old_column

Error 1054จึงถูกต้อง

อย่าเพิ่ม old_column กลับทันที

ต้องตรวจว่า Resourceใหม่ควรอ่านข้อมูลจาก:

new_column
หรือ
new_table

แทน

㊶ Data Migration กับ Schema Migration ต้องทำคู่กัน

สมมติ:

fullname

ถูกแยกเป็น:

firstname
lastname

การเพิ่ม Columnsอย่างเดียวอาจยังไม่พอ

ต้อง Backfill Existing Data ตาม Migration Logic

ดังนั้นการแก้ 1054 ด้วย:

ADD COLUMN

โดยไม่มี Data Migration อาจทำให้ Errorหายแต่ข้อมูลเก่ากลายเป็น NULL/Default

㊷ Column Type ต้องตรงด้วย

เมื่อจะเพิ่ม Columnที่หาย อย่าเพียงให้ชื่อเหมือนกัน

ต้องตรวจ:

Type
Length
NULL
DEFAULT
Index
Unique
Foreign Key
Character Set

เพราะ Resourceอาจคาด:

VARCHAR(50)

แต่คุณสร้าง:

INT

แล้ว Errorถัดไปจะกลายเป็น:

1366 Incorrect Value
1264 Out of Range
1406 Data Too Long

㊸ Error 1054 มักเป็น Error ตัวแรกของ Schema Mismatch

หลังแก้ Columnแรก อาจเจอ:

Unknown column 'column_b'

ต่อ

ถ้าเป็นแบบนี้หลาย Columnหลัง Update อย่าแก้ทีละ Columnด้วยมือ

นั่นเป็นสัญญาณแรงว่า:

Database Schema Version
ไม่ตรง
Resource Version

ควรหยุดและหา Migrationทั้งชุด

㊹ 5 Unknown Columns พร้อมกันควรทำอย่างไร

ถ้า Consoleขึ้น:

Unknown column 'citizenid'
Unknown column 'metadata'
Unknown column 'last_seen'
Unknown column 'account_id'
Unknown column 'status'

หลัง Updateเดียว

อย่าทำ:

ALTER TABLE ADD
ALTER TABLE ADD
ALTER TABLE ADD
...

จากการเดา

ให้หา Official Migration ของ Releaseนั้นก่อน

นี่มักเร็วและปลอดภัยกว่ามาก

㊺ mysql_debug ช่วยหา Resource ที่ส่ง Query

Official oxmysql Documentation ระบุว่า:

set mysql_debug true

จะพิมพ์ Queriesใน Server Console และสามารถจำกัดรายชื่อ Resourcesที่ต้อง Debugได้.

ตัวอย่าง:

set mysql_debug [
  "my_resource"
]

เหมาะกับกรณี:

Unknown column

แต่ Error Stackไม่ชัดว่า Resourceไหนเป็นต้นเหตุ

㊻ Debug UI ของ oxmysql

oxmysql Debug UI สามารถแสดง Queriesที่ Resources Execute, Response Time และ Statisticsแยกตาม Resource โดย Documentationแนะนำใช้ใน Developmentหรือ Server Player Countต่ำ.

จึงช่วยตอบ:

Resource ไหน
Query ไหน
ใช้ Column อะไร

ได้รวดเร็ว

㊼ ไม่ต้องเปิด Debug ทั้ง Production ตลอดเวลา

ถ้า Serverมี Playersจำนวนมาก Official oxmysql Documentationแนะนำว่าควรพิจารณา Database Loggingที่เหมาะสมแทนการเปิด Debug UIแบบถาวร.

ใช้ Debugเพื่อจับ Errorแล้วปิด/จำกัด Resourceตามความเหมาะสม

㊽ วิธี Debug แบบ 5 นาที

เมื่อ Consoleขึ้น:

Unknown column 'citizenid' in 'field list'

ทำ:

① จด Error Code = 1054
② จด Column = citizenid
③ จด Context = field list
④ หา Resource
⑤ Copy Query
⑥ SHOW COLUMNS FROM table
⑦ SHOW CREATE TABLE table
⑧ ตรวจ DATABASE()
⑨ ตรวจ Resource Version
⑩ ตรวจ Migration

จากนั้นค่อยตัดสินว่า:

Query ผิด
หรือ
Schema เก่า

㊾ ตัวอย่าง Case 1 — Migration ไม่ได้รัน

Error:

Unknown column 'metadata'
in 'field list'

Resourceใหม่ Query:

SELECT
    `identifier`,
    `metadata`
FROM `players`;

แต่:

SHOW COLUMNS FROM `players`;

มี:

identifier
name
created_at

ไม่มี:

metadata

ตรวจ Release Migrationพบว่ารุ่นใหม่เพิ่ม Metadata Column

Root Cause:

Resource ใหม่
+
Schema เก่า

แก้ด้วย Migrationของ Versionนั้น

㊿ ตัวอย่าง Case 2 — Custom Script ใช้ Framework ผิด

Custom Script:

SELECT `citizenid`
FROM `players`;

แต่ Frameworkของ Serverใช้:

identifier

และไม่มี citizenid

ในกรณีนี้ไม่ควรเพิ่ม citizenid ให้ Databaseทันที

ต้องแก้ Integrationให้ใช้ Identity Columnที่ Frameworkจริงใช้

51. ตัวอย่าง Case 3 — Table Alias ผิด

Query:

SELECT
    p.`identifier`
FROM `players` p
JOIN `characters` c
    ON x.`player_id` = p.`id`;

Aliasที่ประกาศมี:

p
c

แต่ Queryใช้:

x

นี่คือ SQL Query Bug

Schemaไม่ต้องเปลี่ยน

52. ตัวอย่าง Case 4 — Column อยู่ผิด Table

Query:

SELECT
    p.`firstname`
FROM `players` p;

แต่ firstname อยู่:

characters

ตรวจด้วย:

SELECT
    TABLE_NAME
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
  AND COLUMN_NAME = 'firstname';

พบ:

characters

จึงต้องแก้ Join/Queryให้ถูก Table.

53. ตัวอย่าง Case 5 — Database ผิดตัว

SHOW CREATE TABLE players ใน phpMyAdmin:

มี citizenid

แต่ FiveMยัง Error

ตรวจ:

SELECT DATABASE();

ได้:

fivem_old

ขณะที่ Schemaใหม่อยู่:

fivem_new

MariaDB DATABASE() ใช้ดู Default Databaseของ Session.

ให้แก้ Connection/Migration Targetให้ตรง

54. ตัวอย่าง Case 6 — String ไม่ถูก Parameterize

ผิด:

local query =
    "SELECT * FROM players WHERE status = " ..
    status

เมื่อ:

status = active

SQLที่เกิดขึ้น:

SELECT *
FROM players
WHERE status = active;

active อาจถูกตีความเป็น Identifier แทน String Literal

ควร:

MySQL.query.await(
    'SELECT * FROM `players` WHERE `status` = ?',
    {
        status
    }
)

oxmysql Placeholdersใช้ส่ง Parametersแยกจาก Query Structure.

55. Unknown Column จาก SELECT *

SELECT * เองไม่ทำให้ Unknown Columnจาก Field Listที่ไม่ได้ระบุ

แต่ Errorอาจเกิดใน:

WHERE
JOIN
ORDER BY
GROUP BY

ของ Queryเดียวกัน

ตัวอย่าง:

SELECT *
FROM `players`
ORDER BY `last_seen`;

ถ้าไม่มี:

last_seen

ก็ยัง Errorได้

ดังนั้น Copy Queryเต็มก่อน Debug

56. ORDER BY Column หาย

Resourceใหม่อาจเพิ่ม Feature:

เรียงตาม last_seen

แต่ Migrationไม่ได้เพิ่ม:

last_seen

Query:

SELECT *
FROM `players`
ORDER BY `last_seen` DESC;

จะล้มเหลว

Root Causeยังเป็น Schema Versionไม่ตรง

57. GROUP BY Column หาย

เช่น:

SELECT `job`, COUNT(*)
FROM `players`
GROUP BY `job`;

ถ้า jobถูกย้ายไป Tableอื่นแล้ว Queryเก่ายังใช้ก็เกิด Errorได้

อย่าเพิ่ม jobกลับก่อนตรวจ Data Modelใหม่

58. INSERT Column หาย

Query:

INSERT INTO `players`
(
    `identifier`,
    `metadata`
)
VALUES
(
    ?,
    ?
);

ถ้า metadataไม่มีใน Table MariaDBไม่สามารถ Insertได้

นี่ต่างจาก Error 1364 ซึ่ง Fieldมีอยู่แต่ไม่ได้รับค่าหรือ Default

จำ:

1054
Columnไม่มี

1364
Columnมี
แต่ Required Value/Defaultไม่มี

59. UPDATE Column หาย

Query:

UPDATE `players`
SET `last_seen` = NOW()
WHERE `identifier` = ?;

ถ้า last_seenไม่มี:

1054

ไม่ใช่ Error Date/Datetime

เพราะ Databaseยังไม่ถึงขั้นตรวจค่าของ NOW()

มันหา Columnไม่เจอก่อน

60. ALTER TABLE ควรใช้เมื่อยืนยันแล้วว่า Schema ขาดจริง

MariaDBรองรับการเพิ่ม Columnด้วย:

ALTER TABLE ...
ADD COLUMN ...

และรองรับการแก้ Definitionผ่าน ALTER TABLE.

แต่ก่อนทำ Production ควร:

Backup
ตรวจ Official Migration
ตรวจ Existing Data
ตรวจ Index/Constraint
ทดสอบบนสำเนา

61. อย่าลืม Default และ Existing Rows เมื่อ ADD COLUMN

สมมติ Official Migrationเพิ่ม:

`status` VARCHAR(20) NOT NULL DEFAULT 'active'

ถ้าคุณสร้างเพียง:

ADD COLUMN `status` VARCHAR(20);

Schemaจะไม่เท่ากัน

แม้ Error 1054หาย แต่ Behaviorของ Resourceอาจผิด

นี่คือเหตุผลว่าทำไมควรใช้ Migrationจริง

62. Backup ก่อน Schema Change

Error 1054หลายกรณีแก้ด้วย Codeโดยไม่ต้องแตะ Database

แต่ถ้าต้อง:

ADD COLUMN
CHANGE COLUMN
DROP COLUMN

Productionควร Backupก่อน

เพราะ Schema Changeอาจกระทบ Existing Dataและ Resourcesอื่นที่ใช้ Tableเดียวกัน

63. ถ้า Tableใหญ่มากอย่า ALTER แบบรีบๆ

MariaDB ALTER TABLE มีหลาย Operations/Algorithms และผลกระทบขึ้นกับ Operationกับ Table/Engine.

Server Productionที่มี Tableใหญ่ควรทดสอบ Migrationและวาง Maintenance Windowตามความเหมาะสม

อย่าทำ Liveเพียงเพราะต้องการให้ Consoleเงียบเร็ว

64. Error 1054 หลังแก้แล้วควรตรวจอะไรต่อ

หลัง Migration:

SHOW COLUMNS FROM `players`;

จากนั้น:

SHOW CREATE TABLE `players`;

ยืนยันว่า Columnมี Definitionตรงกับ Official Schema.

แล้ว Test:

Resource Start
Player Join
Load Character
Save Character
Reconnect
Relevant Feature

65. Checklist FiveM Error 1054

ตรวจทั้งหมดนี้:

  1. Error Code เป็น 1054 หรือไม่

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

  3. Column ชื่ออะไร

  4. Errorอยู่ field list หรือไม่

  5. Errorอยู่ where clause หรือไม่

  6. Errorอยู่ Join/ON หรือไม่

  7. Resource ไหนส่ง Query

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

  9. Tableไหน

  10. Aliasไหน

  11. SHOW COLUMNS มี Columnหรือไม่

  12. SHOW CREATE TABLE มี Columnหรือไม่

  13. Columnอยู่ Tableอื่นหรือไม่

  14. information_schema.COLUMNS พบ Columnที่ไหน

  15. พิมพ์ชื่อผิดหรือไม่

  16. Columnถูก Renameหรือไม่

  17. Columnถูก Dropหรือไม่

  18. Resourceเพิ่ง Updateหรือไม่

  19. Migrationรันหรือยัง

  20. Resource Versionตรง Schemaหรือไม่

  21. Frameworkตรงกับ Scriptหรือไม่

  22. Custom Scriptเก่าหรือไม่

  23. Databaseถูกตัวหรือไม่

  24. SELECT DATABASE() ได้อะไร

  25. Connection Stringชี้ Databaseไหน

  26. Restore Backupเก่าหรือไม่

  27. SQL Importครบหรือไม่

  28. Resourceใช้ Dynamic Columnหรือไม่

  29. Dynamic Columnผ่าน Whitelistหรือไม่

  30. Valueถูกต่อเข้า SQLโดยตรงหรือไม่

  31. ควรใช้ Parameterหรือไม่

  32. Aliasถูกต้องหรือไม่

  33. Column Typeตาม Migrationคืออะไร

  34. Default/NULLถูกต้องหรือไม่

  35. Backupก่อน ALTERแล้วหรือไม่

ตาราง Error ที่ควรแยกให้ออก

Errorความหมายหลัก
1048Column ไม่รับ NULL
1049Unknown Database
1054Unknown Column
1062Duplicate Entry
1064SQL Syntax Error
1146Table Doesn't Exist
1264Out of Range
1265Data Truncated
1292Incorrect/Truncated Value
1364Field ไม่มี Default
1366Incorrect Value
1406Data Too Long
1452Foreign Key Constraint Fail

MariaDB Error Reference แยก Error 1054 เป็น ER_BAD_FIELD_ERROR ชัดเจน.

FiveM Unknown Column แก้อย่างไร

เริ่มจาก:

SHOW COLUMNS FROM `table_name`;

และ:

SHOW CREATE TABLE `table_name`;

MariaDBรองรับคำสั่งทั้งสองสำหรับตรวจ Column Metadata และ Table Definition.

จากนั้นเทียบกับ Queryของ Resource

ถ้า:

Resource Query มี Column
Database ไม่มี Column

ต้องหาว่า:

Migrationขาด
หรือ
Resourceใช้ Schemaผิด

FiveM Error 1054 คืออะไร

คือ:

ER_BAD_FIELD_ERROR

SQLSTATE:

42S22

ข้อความ:

Unknown column '...' in '...'

FiveM Unknown Column in Field List คืออะไร

หมายถึง MariaDBหา Column/Identifierที่ Queryอ้างถึงใน Field Contextนั้นไม่พบ

ตรวจ:

SELECT list
INSERT column list
UPDATE assignment

และดูชื่อ Table/Aliasที่ Columnควรอยู่

FiveM Unknown Column in WHERE Clause แก้อย่างไร

ตรวจ:

SHOW COLUMNS FROM `table_name`;

แล้วเทียบกับ:

WHERE `column_name` = ?;

หาก Columnถูก Renameหลัง Framework Update ให้แก้ Resourceให้ใช้ Schemaปัจจุบันหรือ Apply Migrationที่ถูก Version

FiveM Unknown Column หลัง Update Script แก้อย่างไร

ตรวจตามนี้:

Resource Version
↓
Migration Files
↓
SHOW CREATE TABLE
↓
Column ที่ Resource Query

ถ้าหลาย Columnsหายพร้อมกันหลัง Update มีโอกาสสูงว่า Database Migrationยังไม่ครบ มากกว่าจะเป็น Columnผิดทีละตัว

FiveM Unknown Column หลังเปลี่ยน Framework แก้อย่างไร

ตรวจว่า Custom Scriptใช้ชื่อ Fieldsของ Frameworkเดิมหรือไม่ เช่น:

identifier
citizenid
character_id
owner

อย่าเพิ่ม Columnsของ Frameworkเดิมกลับเข้า Databaseใหม่แบบสุ่ม

ควรแก้ Integrationให้ตรง Data Modelของ Frameworkปัจจุบัน

FiveM Unknown Column หลัง Restore Database แก้อย่างไร

ถ้า Backupเก่ากว่า Resource Files:

Tableอาจอยู่ครบ
แต่ Columnsใหม่หาย

ให้ Apply Migrationsจาก Version Backupไป Versionปัจจุบันตามลำดับ

ไม่ควร Import Fresh Schemaทับ Dataโดยอัตโนมัติ

FiveM Unknown Column ทั้งที่ Column มีอยู่ทำอย่างไร

ตรวจ:

SELECT DATABASE();

จากนั้นตรวจ:

Table Alias
Tableจริง
Connection String
Databaseที่ phpMyAdminกำลังเปิด

MariaDB DATABASE() คืน Databaseปัจจุบันของ Session และ oxmysql Connection Stringกำหนด Databaseที่ FiveMใช้งาน.

FiveM ดู Columns ทั้ง Table อย่างไร

ใช้:

SHOW COLUMNS FROM `players`;

MariaDBจะแสดง Columnsและข้อมูลพื้นฐานของแต่ละ Field.

หรือใช้:

SHOW CREATE TABLE `players`;

เพื่อดู Definitionเต็ม.

FiveM หา Column ทั้ง Database อย่างไร

ใช้:

SELECT
    TABLE_NAME,
    COLUMN_NAME,
    DATA_TYPE
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
  AND COLUMN_NAME = 'column_name';

MariaDB information_schema.COLUMNS เก็บ Metadataของ Columnsทุก Tablesบน Server.

FiveM เพิ่ม Column ยังไง

ถ้า Official Migrationยืนยันว่าต้องเพิ่มจริง สามารถใช้ MariaDB ALTER TABLE ... ADD COLUMN ตาม Definitionที่ Resourceกำหนด.

ตัวอย่างเชิงโครงสร้าง:

ALTER TABLE `players`
ADD COLUMN `status`
VARCHAR(20)
NOT NULL
DEFAULT 'active';

แต่ ห้ามคัดลอกตัวอย่างนี้ไปใช้กับ Columnอื่นโดยไม่ดู Official Schema

FiveM ใช้ mysql_debug หา Query ได้ไหม

ได้ Official oxmysql Documentationระบุว่า:

set mysql_debug true

จะ Print Queriesใน Server Console และสามารถจำกัดเฉพาะ Resourcesที่ต้องการ Debugได้.

เหมาะกับ Error 1054 ที่ไม่รู้ว่า Scriptตัวไหนเรียก Columnผิด

FiveM oxmysql Debug UI ช่วยไหม

ช่วยได้ โดย Debug UI แสดง Queriesที่ Resources Execute, Query Response Times และ Statistics ต่อ Resource.

ใช้ใน Developmentหรือ Player Countต่ำตามคำแนะนำของ Documentation

FiveM ใช้ ? แทน Column Name ได้ไหม

ไม่ควรใช้ Value Placeholder ? เพื่อแทน SQL Column Identifier แบบทั่วไป

oxmysql prepare ระบุว่ารองรับ ? สำหรับ Value Placeholders และไม่รองรับ ?? Column Placeholdersหรือ Named Placeholdersใน APIนี้.

Dynamic Columnควร Whitelistใน Codeก่อนสร้าง Query

FiveM Unknown Column เกิดจาก String ไม่ใส่ Quote ได้ไหม

เกิดได้ในเชิง Query Construction หากค่าที่ตั้งใจให้เป็น Stringถูกเขียนเป็น Bare SQL Identifier

วิธีที่ปลอดภัยและชัดกว่าคือใช้ Parameter:

WHERE `status` = ?

แล้วส่งค่าแยกผ่าน oxmysql Placeholder.

FAQ FiveM MariaDB Unknown Column

Error 1054 คืออะไร?

MariaDB Error 1054 คือ ER_BAD_FIELD_ERROR หรือ Unknown column.

SQLSTATE 42S22 คืออะไร?

เป็น SQLSTATE ที่ MariaDBระบุสำหรับ Error 1054 Unknown Column.

Unknown Column หมายถึง Table ไม่มีไหม?

ไม่ Tableอาจมีอยู่แล้ว แต่ Columnที่ Queryอ้างถึงไม่อยู่ใน Table/Contextนั้น

ดู Column ของ Table ยังไง?

ใช้:

SHOW COLUMNS FROM `table_name`;

ดู Schemaเต็มยังไง?

ใช้:

SHOW CREATE TABLE `table_name`;

Unknown Column หลัง Update Script เกิดจาก Migrationได้ไหม?

ได้ หาก Resourceใหม่เรียก Columnที่ Database Schemaเก่ายังไม่มี การไม่ได้ Apply Migrationเป็นสาเหตุสำคัญที่ควรตรวจ

Unknown Column หลัง Restore Backup เกิดได้ไหม?

ได้ ถ้า Backup Databaseเก่ากว่า Resource Versionปัจจุบัน Tablesอาจอยู่ครบแต่ Columnsรุ่นใหม่หาย

Unknown Column หลังเปลี่ยน Framework เกิดได้ไหม?

ได้ เพราะ Frameworkต่างกันสามารถใช้ชื่อ Columns/Data Modelต่างกัน Custom Scriptเก่าจึงอาจอ้าง Fieldsที่ Frameworkใหม่ไม่มี

ต้อง ADD COLUMN ทุกครั้งไหม?

ไม่ ต้องยืนยันก่อนว่า Official Schemaควรมี Columnนั้นจริง เพราะบางครั้ง Queryของ Resourceเป็นฝ่ายผิด

Column มีอยู่แล้วแต่ยัง Error ทำอย่างไร?

ตรวจ:

SELECT DATABASE();

พร้อมดู Table Alias, Connection String และ Databaseจริงที่ FiveMใช้.

ใช้ information_schema หา Columnได้ไหม?

ได้ information_schema.COLUMNS มี Metadataของ Columnsใน Tablesทุก Database.

mysql_debug ช่วยได้ไหม?

ได้ สามารถ Print Queriesที่ oxmysql Executeใน Server Console และจำกัด Resourcesที่ Debugได้.

ใช้ ? แทนชื่อ Columnได้ไหม?

? ใน oxmysql Prepareถูกออกแบบเป็น Value Placeholder ไม่ใช่ Dynamic Column Placeholder.

ประเด็นสำคัญ

เมื่อ FiveMขึ้น:

ERROR 1054
Unknown column '...' in '...'

อย่าเริ่มจาก:

ADD COLUMN แบบเดา
Import SQL ซ้ำ
เปลี่ยน Framework Table แบบสุ่ม

ให้ใช้ Flow นี้:

1054
↓
ดู Column ใน Error
↓
ดู field list / where / join
↓
หา Resource และ Query
↓
SHOW COLUMNS
↓
SHOW CREATE TABLE
↓
SELECT DATABASE()
↓
ตรวจ Resource Version
↓
ตรวจ Migration
↓
ตรวจ Framework/Data Model
↓
แก้ Query หรือ Schemaให้ตรงกัน

MariaDBกำหนด Error 1054 เป็น Unknown column และมีเครื่องมือมาตรฐานอย่าง SHOW COLUMNS, SHOW CREATE TABLE และ information_schema.COLUMNS สำหรับยืนยันว่า Columnมีอยู่จริง อยู่ Tableไหน และมี Definitionอย่างไร.

ถ้า Errorเกิดทันทีหลัง Updateและมี Columnsหายหลายตัว อย่าแก้ทีละ Columnด้วยมือ เพราะมักเป็นสัญญาณว่า Resourceกับ Database Schemaอยู่คนละ Version ให้หา Migrationของ Releaseนั้นก่อน ส่วนถ้า Errorเกิดเฉพาะ Custom Resourceหนึ่งตัวในขณะที่ Frameworkอื่นทำงานปกติ ให้สงสัย Queryหรือ Framework Compatibilityของ Resourceนั้นก่อน

สำหรับผู้อ่าน comsiam ให้จำสูตร “1054 = Table มี แต่ชื่อ Column ที่ Scriptเรียกไม่ตรง Schema” และ comsiam แนะนำให้เทียบ Query → SHOW COLUMNS → SHOW CREATE TABLE → Migration ตามลำดับ เพราะวิธีนี้ช่วยแยกได้ชัดว่า Databaseขาด Columnจริง หรือ Scriptเป็นฝ่ายเรียก Columnผิด โดยไม่ต้องแก้ Schemaแบบลองผิดลองถูก

Comments

Popular posts from this blog

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

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

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