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.

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

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

หรือ:

Unknown column 'garage' in 'where clause'

หรือจาก Resource ที่ใช้ oxmysql:

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

ปัญหานี้มักเกิดหลังอัปเดต Script, เปลี่ยน Framework, Import SQL ไม่ครบ, Migration ไม่ได้รัน หรือ Query ใช้ชื่อ Column ไม่ตรงกับ Schema ปัจจุบัน

วิธีตรวจที่ควรใช้คือ:

Error 1054
↓
ดูชื่อ Column
↓
ดู Table
↓
SHOW COLUMNS
↓
SHOW CREATE TABLE
↓
ดู Query จาก Resource
↓
เทียบ Resource Version กับ Schema
↓
ตรวจ Migration
↓
แก้ Column หรือ Query ที่ต้นเหตุ

① Error 1054 คืออะไร

MariaDB ระบุ:

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

ดังนั้น Error:

Unknown column 'citizenid' in 'field list'

แปลอย่างง่ายว่า MariaDB กำลังประมวลผล Query ที่อ้าง citizenid แต่ไม่พบ Column ดังกล่าวในตำแหน่งที่ Query ใช้งานอยู่

② Unknown Column ไม่ได้แปลว่า Table หาย

ถ้า Table ไม่มี จะเป็นปัญหาคนละประเภท เช่น:

Error 1146
Table doesn't exist

แต่:

Error 1054
Unknown column

หมายถึงต้องตรวจ ชื่อ Column และ Query Context เป็นหลัก ไม่ใช่เริ่มจากสร้าง Table ใหม่.

③ ข้อความ in field list หมายถึงอะไร

ตัวอย่าง:

Unknown column 'citizenid' in 'field list'

มักพบเมื่อ Query พยายามใช้ Column ในส่วนอย่าง:

SELECT `citizenid`
FROM `players`;

หรือ:

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

หรือ:

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

ถ้า Table ไม่มี citizenid Query ก็ไม่สามารถทำงานตามที่ Resource ต้องการได้

④ in where clause หมายถึงอะไร

ตัวอย่าง:

Unknown column 'identifier' in 'where clause'

Query อาจเป็น:

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

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

license
citizenid
player_id

ดังนั้นต้องตรวจ Schema จริงก่อนเปลี่ยน Query

⑤ in order clause ก็เกิดได้

ตัวอย่าง:

SELECT *
FROM `characters`
ORDER BY `created_at` DESC;

แต่ Table ไม่มี:

created_at

MariaDB ก็สามารถรายงาน Unknown Column ตามตำแหน่งที่ Column ถูกนำไปใช้ได้.

⑥ ขั้นแรกใช้ SHOW COLUMNS

ใช้:

SHOW COLUMNS FROM `players`;

MariaDB ระบุว่า SHOW COLUMNS ใช้แสดงข้อมูล Column ของ Table รวมถึง Field Name, Type, Key และข้อมูลประกอบอื่นๆ.

ตัวอย่างผล:

id
license
name
money
job

ถ้า Error บอก:

Unknown column 'citizenid'

แต่รายชื่อ Column ไม่มี citizenid

แสดงว่ามีความไม่ตรงกันจริงระหว่าง Query กับ Table

⑦ ใช้ DESCRIBE ก็ได้

MariaDB ระบุว่า:

DESCRIBE `players`;

หรือ:

DESC `players`;

ใช้ดูข้อมูล Columns และทำหน้าที่เป็น Shortcut ของ SHOW COLUMNS.

ดังนั้นสำหรับการ Debug เร็วๆ:

DESC `players`;

ก็เพียงพอที่จะตรวจว่ามี Column ที่ Resource ต้องการหรือไม่

⑧ ใช้ SHOW CREATE TABLE เมื่อต้องการดูครบ

ใช้:

SHOW CREATE TABLE `players`;

MariaDB ระบุว่า SHOW CREATE TABLE แสดง Definition เต็มของ Table รวมถึง Column Definitions และ Indexes.

ตัวอย่าง:

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

ตรงนี้จะเห็นทันทีว่า:

citizenid

ไม่มีจริง

⑨ อย่าดู SQL File อย่างเดียว

Resource Folder อาจมี Schema:

`citizenid` VARCHAR(50)

แต่ Database Production จริงอาจยังเป็น Version เก่าที่ไม่มี Column นี้

ดังนั้นควรเชื่อ:

SHOW CREATE TABLE `table_name`;

ของ Database ที่ FiveM ใช้จริงก่อน แล้วจึงเทียบกับ Migration/Schema ของ Resource.

⑩ สาเหตุยอดนิยมที่สุด: Resource ใหม่ แต่ Database เก่า

ตัวอย่าง:

Resource v1
players:
id
license
name

Resource v2 เพิ่ม:

citizenid

Query รุ่นใหม่:

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

แต่ Admin อัปเดตเพียง Resource Files และไม่ได้รัน Migration

ผลคือ:

Unknown column 'citizenid'

กรณีนี้ควรหา Migration ของ Version ที่กำลังใช้ ไม่ใช่แก้ Query กลับไปใช้ Schema เก่าโดยไม่ตรวจผลกระทบ

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

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

Schema ใหม่

อาจ Rename:

identifier
→ citizenid

แต่ Custom Resource เก่ายัง Query:

SELECT `identifier`
FROM `players`;

MariaDBก็จะหา identifier ไม่พบ

ดังนั้น Error 1054 ไม่ได้หมายความว่า Databaseต้องอัปเดตเสมอ

บางครั้ง Resource ที่ Query อยู่เป็นฝ่ายเก่า

⑫ หลังเปลี่ยน Framework เจอบ่อยมาก

ตัวอย่างเชิงแนวคิด:

Framework A
ใช้ identifier

Framework B
ใช้ citizenid

Custom Script
ยังใช้ identifier

เมื่อ Custom Script ถูกนำไปใช้กับ Schema ของ Framework B:

Unknown column 'identifier'

จึงต้องตรวจว่า Resource รองรับ Framework ที่กำลังใช้อยู่จริงหรือไม่

⑬ อย่าเพิ่ม Column เพียงเพราะชื่ออยู่ใน Error

ถ้า Error:

Unknown column 'citizenid'

วิธีที่ไม่ควรทำทันทีคือ:

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

เพราะคุณยังไม่รู้ว่า Column นี้ต้องเป็น:

VARCHAR เท่าไร
NULL หรือ NOT NULL
UNIQUE หรือไม่
DEFAULT อะไร
มี Index หรือไม่
สัมพันธ์กับ Table อื่นหรือไม่

การสร้าง Column แบบเดาอาจทำให้ Error 1054 หาย แต่สร้าง Schema ที่ Resource ไม่รองรับ

⑭ ใช้ Official Migration ก่อน ALTER เอง

ถ้า Resource Version ใหม่มี Migration เช่น:

v2_to_v3.sql
migration.sql
upgrade.sql

ให้ตรวจ Migration นั้นก่อน

เพราะ Migration อาจไม่ได้ทำเพียง:

ADD COLUMN

แต่อาจต้อง:

Rename Column
Backfill Data
Create Index
Convert Data Type
Update Existing Rows

การเพิ่ม Column เองจึงอาจไม่ครบ

⑮ Column Rename เป็นสาเหตุสำคัญ

สมมติ Version เก่า:

owner

Version ใหม่:

identifier

Migration อาจ Rename Column

แต่ Custom Script ยังใช้:

SELECT `owner`
FROM `vehicles`;

ผลคือ:

Unknown column 'owner'

การแก้ที่ถูกต้องอาจเป็น Update Resource ไม่ใช่สร้าง owner ใหม่เพิ่มกลับเข้าไป

⑯ Column ถูก Drop แล้ว Resource เก่ายังใช้

Migration ใหม่อาจลบ Column ที่ไม่ได้ใช้แล้ว

เช่น:

old_status

ถูกแทนด้วย:

status

Custom Script ยัง:

UPDATE `players`
SET `old_status` = ?;

จึงเกิด 1054

ก่อนเพิ่ม Column กลับมา ต้องตรวจว่า Data Modelใหม่ใช้ Field อะไรแทน

⑰ Column พิมพ์ผิดก็เกิดได้

ตัวอย่าง Table มี:

identifier

แต่ Query เขียน:

identifer

ขาดตัว i

Query:

SELECT `identifer`
FROM `players`;

MariaDBจะหา Column ชื่อนั้นไม่พบ

ดังนั้นอย่ามองข้าม Typo ง่ายๆ

⑱ ตรวจตัวพิมพ์และ Spelling ทุกครั้ง

เมื่อ Errorขึ้น:

Unknown column 'metadata'

ตรวจว่า Schemaใช้:

metadata
meta_data
player_metadata

หรือชื่ออื่น

อย่าสมมติว่าชื่อที่คล้ายกันคือ Column เดียวกัน

⑲ Table Alias ผิดก็ทำให้เหมือน Unknown Column ได้

ตัวอย่าง:

SELECT
    p.identifier
FROM `players` AS p;

ถูก

แต่ถ้า Query เขียน:

SELECT
    c.identifier
FROM `players` AS p;

ทั้งที่ไม่มี Alias c

ก็เป็น Query Reference ที่ผิด

ดังนั้น Error 1054 ไม่ได้หมายถึง Columnขาดจาก Tableทุกครั้ง อาจเป็น Qualification/Alias ที่เขียนผิดด้วย

⑳ JOIN แล้วอ้าง Column ผิด Table

ตัวอย่าง:

SELECT
    p.identifier,
    v.plate
FROM `players` p
JOIN `vehicles` v
    ON v.owner = p.identifier;

ถ้า vehicles ไม่มี owner แต่ใช้:

citizenid

Queryก็จะผิด

ต้องตรวจ Columns ของทั้งสอง Tables:

SHOW COLUMNS FROM `players`;
SHOW COLUMNS FROM `vehicles`;

MariaDB รองรับ SHOW COLUMNS สำหรับตรวจ Columns ของแต่ละ Table โดยตรง.

㉑ SELECT * ผ่าน แต่ SELECT Column เฉพาะไม่ผ่าน

ตัวอย่าง:

SELECT *
FROM `players`;

ทำงานได้

แต่:

SELECT `citizenid`
FROM `players`;

Error

นี่เป็นหลักฐานชัดว่า:

Table มี
Connection ใช้ได้
แต่ Column ที่เรียกไม่มี

ไม่ต้องเริ่มแก้ Connection String

㉒ INSERT ก็เกิด Unknown Column ได้

ตัวอย่าง:

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

แต่ Table ไม่มี:

nickname

Queryจะล้มเหลว

ดังนั้น Error 1054 ไม่ได้จำกัดเฉพาะ SELECT

㉓ UPDATE ก็เกิดได้

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

ถ้าไม่มี:

last_seen

ก็เกิด Unknown Column

ถ้า Resource Versionใหม่เพิ่ม last_seen นี่เป็นสัญญาณให้ตรวจ Migration

㉔ WHERE Clause ก็ต้องตรง Schema

Query:

DELETE FROM `vehicles`
WHERE `citizenid` = ?;

หาก Tableใช้:

owner

Resource จะหา citizenid ไม่พบ

อย่าเปลี่ยน Table Schema ก่อนรู้ว่า Frameworkปัจจุบันใช้ Ownership Field แบบไหน

㉕ Column อยู่คนละ Table

Errorบางกรณีเกิดเพราะ Developerจำ Schema ผิด

เช่น:

players
มี identifier

characters
มี citizenid

แต่ Query:

SELECT `citizenid`
FROM `players`;

Columnมีอยู่จริงใน Database แต่ อยู่คนละ Table

SHOW COLUMNS ของ Table ที่ Queryใช้จะช่วยยืนยันจุดนี้ได้.

㉖ ใช้ information_schema.COLUMNS ตรวจหลาย Tables

MariaDB มี information_schema.COLUMNS ซึ่งให้ข้อมูล Column ของ Tables บน Server รวมถึงชื่อ Database, Table, Column, Data Type และ Default.

ตัวอย่าง:

SELECT
    TABLE_SCHEMA,
    TABLE_NAME,
    COLUMN_NAME,
    DATA_TYPE
FROM information_schema.COLUMNS
WHERE COLUMN_NAME = 'citizenid';

ช่วยตอบว่า:

citizenid
อยู่ Table ไหนบ้าง?

㉗ จำกัดให้ค้นเฉพาะ Database ปัจจุบัน

ใช้:

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

ถ้าไม่มีผลลัพธ์ แสดงว่า Database ปัจจุบันไม่มี Columnชื่อนั้นใน Tables ที่ Metadataมองเห็น.

㉘ ตรวจหลาย Column พร้อมกัน

ถ้า Resource Errorหลาย Fields:

citizenid
metadata
last_seen

สามารถดู Schemaทั้ง Table:

SHOW COLUMNS FROM `players`;

แทน Queryทีละชื่อ

MariaDB ระบุว่า SHOW COLUMNS แสดง Field, Type, Null, Key, Default และ Extra Information ของ Columns.

㉙ Error หลัง Import SQL

ถ้า Import SQL แล้ว Error 1054 เริ่มขึ้น อาจเกิดจาก:

Import Schema เก่า
Import Schema คนละ Framework
Import ไม่ครบ
Importเฉพาะบาง Table
Migration ไม่ครบ

ตรวจ SHOW CREATE TABLE แล้วเทียบกับ Resource Version

อย่า Import SQL ซ้ำหลายรอบโดยยังไม่รู้ Schema ที่ถูกต้อง

㉚ Error หลัง Restore Backup

ตัวอย่าง:

Resource Files = ปัจจุบัน
Backup Database = 6 เดือนก่อน

หลัง Restore Database Schema อาจไม่มี Columns ที่ Resourceรุ่นปัจจุบันเพิ่มเข้ามาแล้ว

ผล:

Unknown column

วิธีแก้คือ Apply Migrations จาก Backup Version ไปยัง Current Versionอย่างถูกลำดับ ไม่ใช่สร้างทุก Columnที่ Consoleร้องทีละตัว

㉛ อย่าแก้ Error ทีละ Column ถ้า Schema ต่างกันทั้ง Version

สมมติ Resourceเริ่ม Error:

Unknown column 'citizenid'

คุณเพิ่ม citizenid

Restart แล้วได้:

Unknown column 'metadata'

เพิ่ม metadata

Restart แล้วได้:

Unknown column 'last_seen'

นี่เป็นสัญญาณว่า:

Schema Version ทั้งชุดไม่ตรง

ไม่ควรไล่สร้าง Columnทีละตัว

ให้หา Migration/Schema Version ที่ถูกต้อง

㉜ Schema Diff ช่วยมาก

เปรียบเทียบ:

Current Database Schema
vs
Official Schema ของ Resource Version ปัจจุบัน

โดยดู:

Columns
Data Types
Nullability
Defaults
Indexes
Constraints

SHOW CREATE TABLE เหมาะกับงานนี้เพราะแสดง Definition และ Indexes ของ Tableครบใน Statement เดียว.

㉝ Error 1054 หลัง Rename Column

ถ้า Adminเคยทำ:

ALTER TABLE `players`
RENAME COLUMN `identifier`
TO `citizenid`;

แต่ Resourcesบางตัวใช้ชื่อเดิม

Resourceเหล่านั้นจะ Error

ดังนั้นก่อน Rename Field ใน Production ต้องค้น Queryจาก Resources ที่พึ่ง Columnนั้นทั้งหมด

㉞ Custom Resource เป็นตัวการที่พบบ่อย

Framework Main Resourceอาจ Migrationครบแล้ว

แต่ Custom Scripts เช่น:

garage
housing
phone
inventory bridge
jobs
admin
logs

ยังอ้าง Columns แบบเก่า

ดังนั้นถ้า Main Frameworkทำงานแต่ Custom Resourceหนึ่ง Error 1054 ให้เริ่มจาก Resourceนั้นก่อน

㉟ ถ้าหลาย Resource Errorพร้อมกัน

ถ้าเกิดหลัง Restore หรือ Update และ Resourcesหลายตัวขึ้น Unknown Columnพร้อมกัน ให้สงสัย:

Schema Migration ไม่ครบ
Databaseผิด Version
Backupเก่า

ก่อนคิดว่า Scriptsหลายตัวพังพร้อมกันโดยบังเอิญ

㊱ mysql_debug ช่วยหา Query ที่ Error

oxmysql Documentation ระบุว่าเปิด:

set mysql_debug true

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

ตัวอย่าง:

set mysql_debug [
  "my_resource"
]

เหมาะมากเมื่อ Error 1054 ไม่ได้แสดง SQL เต็มใน Error Stack

㊲ Debug UI ของ oxmysql

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

ใช้เพื่อจับ:

Resource
↓
Query
↓
เวลาที่ Error เกิด

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

㊳ อย่าเปิด Debug หนักๆ โดยไม่จำเป็น

Official oxmysql Documentation ระบุว่า Debug UI เหมาะกับ Development/Serverผู้เล่นน้อย และ Serverขนาดใหญ่ควรพิจารณา Logging ที่เหมาะสมกว่า.

ดังนั้น Debug Error 1054 แล้วปิดเมื่อหา Root Causeได้จะเหมาะกว่าเปิดตลอดบน Productionโดยไม่จำเป็น

㊴ ตัวอย่าง Debug จริง

Console:

Unknown column 'citizenid' in 'where clause'

Query:

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

ตรวจ:

SHOW COLUMNS FROM `vehicles`;

พบ:

id
owner
plate
vehicle

ไม่มี:

citizenid

ตรงนี้ต้องถามต่อว่า:

Resourceควรใช้ owner?
หรือ Migrationควรเพิ่ม citizenid?

คำตอบต้องมาจาก Resource/Framework Version

㊵ ตัวอย่าง Resource ใหม่ Schema เก่า

Official Migration Versionใหม่กำหนด:

owner
→ citizenid

แต่ Databaseยังมี:

owner

Resource Query:

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

กรณีนี้ควรทำ Migration

ไม่ควรแก้ Resourceกลับไปใช้ owner หาก Versionใหม่ทั้งระบบออกแบบมาใช้ citizenid

㊶ ตัวอย่าง Custom Script เก่า

Database/Frameworkใหม่ใช้:

citizenid

แต่ Custom Garageเก่า:

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

ถ้า Migrationได้ Rename owner ออกไปแล้ว Custom Scriptต้องอัปเดต Query/Bridge ให้ตรง Frameworkใหม่

ไม่ควรเพิ่ม owner ซ้ำกลับเข้า Databaseทันที

㊷ Unknown Column จาก String ที่ไม่ได้ Quote ถูกต้อง

SQL Identifier กับ String Value เป็นคนละสิ่ง

ถ้า Query Constructionผิด MariaDBอาจตีความบาง Token ว่าเป็น Column Name แทนค่าข้อมูลได้

วิธีลดปัญหาคือใช้ Parameter Placeholdersสำหรับ Values แทนการต่อ String SQLจากข้อมูล Runtime

สำหรับ FiveM/oxmysql ควรใช้ Query Parameters ตาม API ที่ Resourceใช้งาน

㊸ อย่าต่อ Player Input เป็น SQL

ไม่ควร:

local query =
    'SELECT * FROM players WHERE name = ' ..
    playerName

เพราะ SQL Structure อาจเปลี่ยนตาม Input

ควรใช้:

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

แม้ Parameterizationไม่ได้แก้ Columnที่ไม่มี แต่ช่วยแยก SQL Structure ออกจาก Values และทำให้ Debugง่ายขึ้น

㊹ Dynamic Column Name ต้อง Whitelist

ถ้า Resourceรองรับ Sorting:

name
created_at
money

ไม่ควรนำ Client Inputมาต่อเป็น:

ORDER BY <client_value>

ตรงๆ

ให้ Map:

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

หาก Config/Clientส่งชื่อ Columnที่ไม่มี MariaDBก็จะเกิด Unknown Column ได้เช่นกัน

㊺ Generated Column ก็ตรวจได้

MariaDB ระบุว่า SHOW CREATE TABLE รองรับการแสดง Generated Columns และ DESCRIBE สามารถใช้ตรวจข้อมูล Columnลักษณะนี้ได้.

ดังนั้นถ้า Resourceพึ่ง Generated Field อย่าสมมติว่า Columnธรรมดากับ Generated Columnเหมือนกันทุก Version

㊻ Error 1054 กับ Error 1060 ต่างกัน

MariaDB Error Reference แยก:

1054
Unknown column

กับ:

1060
Duplicate column name

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

ADD COLUMN

แต่ Columnมีอยู่จริงในอีก Form/Context อาจสร้าง Errorใหม่หรือ Schemaซ้ำซ้อน

ตรวจก่อนทุกครั้ง

㊼ Error 1054 กับ Error 1072 ต่างกัน

MariaDB ยังมี Error:

1072
Key column doesn't exist in table

ซึ่งเกี่ยวกับการสร้าง Key/Index ที่อ้าง Columnไม่มี แตกต่างจาก Runtime Queryที่ขึ้น Error 1054.

จึงต้องอ่าน Error Codeเต็ม ไม่ใช่เห็นคำว่า Columnแล้วใช้วิธีแก้เดียวกัน

㊽ Error 1054 กับ Error 1052

MariaDB Error:

1052
Column is ambiguous

เกิดเมื่อมีหลาย Tables/Columns ที่ทำให้ Databaseไม่รู้ว่าต้องใช้ Columnจาก Tableไหน

ส่วน:

1054
Unknown column

คือหา Columnอ้างอิงนั้นไม่พบ.

ตัวอย่าง Ambiguous:

SELECT `id`
FROM `players`
JOIN `vehicles`
ON ...

ถ้าทั้งสอง Tableมี id

อาจต้องระบุ:

players.id

แทน

㊾ Error 1054 กับ Table Doesn't Exist

จำง่ายๆ:

1146
ไม่มี Table
1054
มี Table แต่ Column/Reference ที่ Queryเรียกไม่พบ

ตรวจตามลำดับ:

SHOW TABLES
↓
SHOW COLUMNS
↓
SHOW CREATE TABLE

MariaDB มี Commandsเหล่านี้สำหรับตรวจ Tableและ Column Metadata โดยตรง.

㊿ วิธีแก้ Error 1054 แบบ 5 นาที

เมื่อ Console ขึ้น:

Unknown column 'citizenid'

ทำตามนี้:

① จดชื่อ Table
② จดชื่อ Column
③ Copy Query เต็ม
④ SHOW COLUMNS FROM table
⑤ SHOW CREATE TABLE table
⑥ ตรวจว่า Column มีจริงไหม
⑦ ตรวจ Spelling
⑧ ตรวจ Table Alias
⑨ ตรวจ Resource Version
⑩ ตรวจ Database Migration
⑪ ตรวจ Custom Script Compatibility
⑫ แก้ Query หรือ Migrationตาม Schemaที่ถูกต้อง

51. ถ้า Column ไม่มีจริงต้องทำอะไร

มี 3 กรณีหลัก:

A. Columnควรมี
→ Migrationขาด

B. Columnไม่ควรมีแล้ว
→ Resourceเก่า

C. ชื่อ Columnเขียนผิด
→ Query Bug

อย่าเลือก:

ALTER TABLE ADD COLUMN

จนกว่าจะรู้ว่าอยู่กรณีไหน

52. ถ้า Migration ขาด

แนวทาง:

Backup
↓
ระบุ Version ปัจจุบัน
↓
หา Migrationที่ขาด
↓
Testบนสำเนา Database
↓
Applyตามลำดับ
↓
SHOW CREATE TABLE
↓
Test Resource

ไม่ควร Import Fresh-install SQL ทับ Production Database ที่มีข้อมูลจริงเพียงเพื่อเพิ่ม Columnเดียว

53. ถ้า Resource เก่า

ให้ตรวจว่า Resourceมี Versionที่รองรับ Framework/Schemaปัจจุบันหรือไม่

ถ้าไม่มี อาจต้อง:

แก้ Query
สร้าง Bridge
เปลี่ยน Resource

ตาม Architecture

ไม่ควรทำ Databaseย้อนกลับให้ Resourcesเก่าทั้งหมดโดยไม่มีแผน

54. ถ้า Query Bug

ตัวอย่าง:

SELECT `identifer`
FROM `players`;

แต่ Tableมี:

identifier

เพียงแก้:

SELECT `identifier`
FROM `players`;

ไม่ต้อง ALTER Databaseใดๆ

นี่เป็นกรณีที่ง่ายที่สุด

55. ถ้า Column มีอยู่แต่ Error ยังขึ้น

ตรวจต่อ:

Database ที่ FiveMใช้
Table ที่ Queryใช้
Alias
Schema/Database Prefix
Case/Spelling

และใช้ oxmysql Debug ดู Query Runtimeจริง

เพราะ Source Code ที่คุณเปิดอยู่อาจไม่ใช่ Queryสุดท้ายที่ Resource Execute

oxmysql สามารถพิมพ์ Queriesใน Server Consoleเมื่อเปิด mysql_debug.

56. Restart MariaDB ช่วยไหม

ถ้า Columnไม่มีจริง:

Restart MariaDB

ไม่สร้าง Columnให้

และถ้า Queryใช้ชื่อผิด:

Restart FXServer

ก็ไม่แก้ Query

Restartมีประโยชน์หลังคุณ Deploy Code/Migrationบางกรณี แต่ไม่ใช่ Root-cause Fix ของ Unknown Column

57. ล้าง FiveM Cache ช่วยไหม

Error 1054 มาจาก SQL Queryกับ Database Schemaเป็นหลัก

หาก Consoleระบุ MariaDB:

Unknown column

การล้าง FiveM Client Cacheไม่ใช่ขั้นตอนหลักในการแก้

ให้ตรวจ Resourceฝั่ง Serverและ Databaseก่อน

58. Backup ก่อน ALTER Column

ถ้าตรวจแล้วว่า Migrationต้อง:

ADD COLUMN
RENAME COLUMN
MODIFY COLUMN

ใน Production

ควร Backupก่อน

โดยเฉพาะ Tables:

players
characters
vehicles
inventory
properties

ที่มีข้อมูลผู้เล่นจำนวนมาก

59. ตรวจหลัง Migration

หลังทำ Migration:

SHOW COLUMNS FROM `players`;

และ:

SHOW CREATE TABLE `players`;

เพื่อยืนยันว่า Column, Type, Default และ Index Definitionตรงตามที่ Resourceต้องการ.

อย่าหยุดเพียงเพราะ SQLขึ้น:

Query OK

60. Test Resource หลังแก้

ทดสอบ Flowที่เคย Error เช่น:

Player Join
Character Create
Character Load
Save
Vehicle Spawn
Garage Save
Disconnect
Reconnect
Resource Restart

เพราะ Queryแรกอาจผ่านแล้ว แต่ Schema Versionยังมี Columnอื่นขาดอยู่

61. Checklist FiveM Unknown Column

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

  1. Error Code เป็น 1054 หรือไม่
  2. SQLSTATE เป็น 42S22 หรือไม่
  3. Column ชื่ออะไร
  4. Error อยู่ field list, where clause หรือส่วนไหน
  5. Table ไหน
  6. Queryเต็มคืออะไร
  7. Resourceไหนยิง Query
  8. SHOW COLUMNS มี Columnไหม
  9. DESCRIBE ตรงไหม
  10. SHOW CREATE TABLE เป็น Schema Versionไหน
  11. Columnสะกดถูกไหม
  12. Table Aliasถูกไหม
  13. Columnอยู่คนละ Tableหรือไม่
  14. JOINใช้ Fieldถูกไหม
  15. Resourceเพิ่ง Updateหรือไม่
  16. Frameworkเพิ่ง Updateหรือไม่
  17. Migrationรันครบไหม
  18. Backupเก่าเพิ่ง Restoreหรือไม่
  19. install.sql เป็น Versionเดียวกันไหม
  20. Custom Scriptรองรับ Frameworkใหม่ไหม
  21. Columnถูก Renameไหม
  22. Columnถูก Dropไหม
  23. Adminเคย ALTER Tableเองไหม
  24. มี Columnชื่อคล้ายกันไหม
  25. Databaseปัจจุบันถูกตัวไหม
  26. Runtime Queryตรงกับ Sourceที่ดูไหม
  27. mysql_debugเปิดตรวจแล้วหรือไม่
  28. Schema Diffแล้วหรือไม่
  29. Backupก่อน Migrationแล้วหรือไม่
  30. Testหลังแก้แล้วหรือไม่

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

Errorความหมาย
1048Column Cannot Be Null
1049Unknown Database
1052Column Ambiguous
1054Unknown Column
1060Duplicate Column Name
1062Duplicate Entry
1072Key Column Doesn't Exist
1146Table Doesn't Exist
1364Field Doesn't Have Default
1366Incorrect Value
1406Data Too Long

MariaDB Error Reference แยกรหัสเหล่านี้เป็นคนละสาเหตุ จึงควรเริ่มจาก Error Code จริงทุกครั้ง.

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

ใช้:

SHOW COLUMNS FROM `table_name`;

ก่อน

ถ้าไม่มี Columnนั้น:

ตรวจ Migration
Resource Version
Framework Version
ชื่อ Column

MariaDB ระบุว่า SHOW COLUMNS แสดงโครงสร้าง Columnsของ Tableโดยตรง.

FiveM Error 1054 คืออะไร

MariaDB Error 1054 คือ:

ER_BAD_FIELD_ERROR

SQLSTATE:

42S22

ข้อความ:

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

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

ตรวจ Columns ที่ถูกใช้ใน:

SELECT
INSERT
UPDATE

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

SHOW COLUMNS FROM `table_name`;

หาก Columnไม่มี ต้องหาว่า Schemaเก่าหรือ Queryเก่า

อย่าเพิ่ม Columnก่อนรู้ Official Data Model

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

ตรวจ:

WHERE `column_name` = ?

ว่า Columnนั้นอยู่ใน Tableจริงหรือไม่

โดยเฉพาะ Resourcesที่เปลี่ยนจาก:

owner
identifier
citizenid
license

ตาม Framework/Versionต่างๆ

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

ตรวจ:

Resource Version
Migration
SHOW CREATE TABLE

เป็นสามอย่างแรก

ถ้า Resourceใหม่เรียก Columnใหม่ แต่ Databaseไม่มี นี่เป็นสัญญาณว่า Migrationอาจขาด

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

ตรวจ Mappingของ:

Player ID
Character ID
Owner
Identifier
Job
Vehicle Owner

ระหว่าง Frameworkเก่ากับใหม่

Custom Scriptsมักเป็นส่วนที่ต้องแก้ Query/Bridge ให้ตรง Data Modelใหม่

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

ถ้า Restore Backupเก่า ให้ Apply Migrationsตาม Versionจน Schemaตรง Resourceปัจจุบัน

อย่าสร้าง Columnsจาก Consoleทีละตัว เพราะมักหมายถึง Schemaทั้งชุดเก่า

FiveM ดู Columns ของ Table อย่างไร

ใช้:

SHOW COLUMNS FROM `players`;

หรือ:

DESCRIBE `players`;

MariaDB ระบุว่า DESCRIBE เป็น Shortcutสำหรับดู Column Information เช่นเดียวกับ SHOW COLUMNS.

FiveM ดู Full Schema อย่างไร

ใช้:

SHOW CREATE TABLE `players`;

เพื่อดู Definition, Data Types และ Indexes.

FiveM หา Column ว่าอยู่ Table ไหน

ใช้:

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

MariaDB information_schema.COLUMNS มี Metadataเกี่ยวกับ Columnsทุก Table.

FiveM oxmysql ดู Query ที่ Error อย่างไร

เปิด:

set mysql_debug true

Official oxmysql Documentation ระบุว่าจะ Print Queriesใน Server Console และสามารถจำกัดเฉพาะ Resourcesบางตัวได้.

หรือใช้ Debug UI เพื่อดู Queriesและ Per-resource Statisticsใน Environmentที่เหมาะสม.

FiveM เพิ่ม Column เพื่อแก้ Error 1054 ได้ไหม

ได้เฉพาะเมื่อยืนยันแล้วว่า Official Schema ของ Resource Versionนั้นต้องมี Columnจริง

ไม่ควรเพิ่ม Columnจากชื่อ Errorอย่างเดียว

เพราะ Definitionต้องถูกทั้ง:

Data Type
NULL
DEFAULT
INDEX
UNIQUE
Constraint

FAQ FiveM MariaDB Unknown Column

Error 1054 คืออะไร?

คือ MariaDB ER_BAD_FIELD_ERROR เมื่อ Queryอ้าง Columnที่หาไม่พบ.

SQLSTATE ของ Error 1054 คืออะไร?

คือ:

42S22

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

ไม่ ถ้า Tableไม่มีจะเป็น Errorประเภท Table Doesn't Exist เช่น 1146 ส่วน 1054ให้ตรวจ Column/Query Reference.

ดูว่ามี Columnหรือไม่อย่างไร?

ใช้:

SHOW COLUMNS FROM `table_name`;

DESCRIBE ใช้แทนได้ไหม?

ได้ MariaDBระบุว่า DESCRIBE เป็น Shortcutของ SHOW COLUMNS.

SHOW CREATE TABLE มีประโยชน์อย่างไร?

ใช้ดู Definitionเต็มของ Tableรวม Columnsและ Indexes จึงเหมาะสำหรับเทียบกับ Official Schema.

Error หลัง Update Script เกิดจาก Migration ไม่ครบได้ไหม?

ได้ เป็นหนึ่งในสาเหตุที่ควรตรวจเมื่อ Resourceใหม่เรียก Columnที่ Production Schemaยังไม่มี

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

ได้หาก Backup Schemaเก่ากว่า Resource Filesปัจจุบัน

ควร ADD COLUMN ทันทีไหม?

ไม่ ควรยืนยัน Official Schemaก่อน เพราะ Resourceอาจเป็นฝ่ายใช้ชื่อ Columnเก่า

Error เกิดจาก Typo ได้ไหม?

ได้ เช่น Schemaมี identifier แต่ Queryใช้ identifer

Error เกิดจาก JOIN ได้ไหม?

ได้ หาก Queryอ้าง Columnจาก Table/Aliasผิดตัว

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

ได้ oxmysqlสามารถ Print Queriesใน Server Consoleเมื่อเปิด Debug.

Restart MariaDB ช่วยไหม?

ไม่หาก Root Causeคือ Columnไม่มีหรือ Queryใช้ชื่อผิด ต้องแก้ Schema/Resourceที่ต้นเหตุ

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

เมื่อ FiveM Consoleขึ้น:

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

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

ADD COLUMN แบบเดา
Import install.sql ซ้ำ
ลบ Table
ปิด SQL Mode

ให้ใช้ Flow นี้:

1054
↓
ดู Column
↓
ดู Query
↓
SHOW COLUMNS
↓
SHOW CREATE TABLE
↓
ดู Resource Version
↓
ดู Migration
↓
ดู Framework Compatibility
↓
ตัดสินว่า Queryเก่าหรือ Schemaเก่า
↓
แก้ให้ตรง Version

MariaDB ระบุ Error 1054 เป็น ER_BAD_FIELD_ERROR สำหรับ Unknown Column และมี SHOW COLUMNS, DESCRIBE, SHOW CREATE TABLE รวมถึง information_schema.COLUMNS ให้ใช้ตรวจ Schema จริงอย่างเป็นระบบ.

สำหรับ FiveM จุดที่ต้องระวังที่สุดคือ Resource กับ Database Schema คนละ Version เพราะถ้าเริ่มสร้าง Columns ตาม Errorทีละตัว คุณอาจได้ Databaseที่ชื่อ Fieldsดูครบแต่ Data Types, Indexes และ Migration Logicผิดทั้งหมด

สำหรับผู้อ่าน comsiam ให้จำสูตร “1054 = Table มี แต่ Column ที่ Queryเรียกไม่ตรง” และ comsiam แนะนำให้เทียบสามสิ่งทุกครั้งคือ Query จริง + SHOW CREATE TABLE + Migration ของ Resource Versionปัจจุบัน เพราะจะช่วยแยกได้ทันทีว่าควรแก้ SQL Resource หรืออัปเดต Database Schema

Comments

Popular posts from this blog

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

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

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