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

 FiveM MariaDB Unknown column คือ Error ที่เกิดเมื่อ 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'

หรือ:

Unknown column 'garage_id' in 'where clause'

หรือจาก oxmysql:

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

ปัญหานี้มักหมายความว่า Table มีอยู่แล้ว แต่โครงสร้างภายใน Table ไม่ตรงกับ SQL ที่ Resource กำลังใช้

สาเหตุที่เจอบ่อย ได้แก่:

Resource ใหม่ แต่ Database Schema เก่า
Migration SQL ยังไม่ได้รัน
Column ถูก Rename
Column ถูกลบ
ชื่อ Column พิมพ์ผิด
Custom Script ใช้ Schema ของ Framework คนละรุ่น
Import SQL ไม่ครบ
Restore Database เก่า
Resource ใช้ชื่อ Alias ผิด
Query ใช้ Column จาก Table ผิดตัว
เชื่อม Database คนละตัว

วิธีแก้ที่ควรใช้คือ:

Error 1054
↓
ดูชื่อ Column
↓
ดู Table / Query
↓
SHOW COLUMNS
↓
SHOW CREATE TABLE
↓
ดู Resource Query
↓
เทียบ Official Schema / Migration
↓
ตัดสินว่า Query ผิดหรือ Schema เก่า
↓
แก้ Root Cause

① Error 1054 คืออะไร

MariaDB ระบุ Error:

1054
42S22
ER_BAD_FIELD_ERROR
Unknown column '%s' in '%s'

ดังนั้นถ้า FiveM แสดง:

Unknown column 'identifier' in 'field list'

MariaDB กำลังบอกว่า SQL Statement อ้างถึง:

identifier

แต่ใน Context ที่ Query กำลังทำงาน MariaDB หา Column นี้ไม่พบ

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

บทความก่อนหน้าเป็น:

1146
Table doesn't exist

หมายถึง Table ที่ Query เรียกหาไม่มี

แต่:

1054
Unknown column

มักหมายถึง Table มีอยู่หรือ Query Parse ไปถึงขั้นตรวจ Columns แล้ว แต่ Column ที่อ้างถึงหาไม่พบ.

จำง่ายๆ:

1146
Table หาย

1054
Column หาย

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

1064

คือ SQL Syntax/Parse Error

ส่วน:

1054

คือ Query สามารถถูกวิเคราะห์ต่อจนพบการอ้าง Column ที่ไม่มี

ดังนั้นถ้า Error ชัดเจนว่า:

Unknown column 'job_grade'

ไม่ควรเริ่มจากตรวจ Comma หรือวงเล็บอย่างเดียว

ให้ตรวจ Schema และชื่อ Column ก่อน

④ in 'field list' หมายถึงอะไร

ตัวอย่าง:

Unknown column 'citizenid' in 'field list'

มักสัมพันธ์กับ Column ที่ถูกอ้างในส่วนอย่าง:

SELECT `citizenid`
FROM `players`;

หรือ:

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

หรือ:

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

ดังนั้นจุดแรกที่ต้องตรวจคือ:

Table นั้นมี citizenid จริงหรือไม่?

⑤ วิธีดู Columns ทั้งหมดของ Table

ใช้:

SHOW COLUMNS FROM `players`;

MariaDB ระบุว่า SHOW COLUMNS แสดงข้อมูล Columns ของ Table หรือ View รวมถึงชื่อ Field, Type, Null, Key, Default และ Extra.

ตัวอย่างผล:

id
identifier
firstname
lastname
job

แต่ไม่พบ:

citizenid

ก็ยืนยันได้ว่า Database Schema ปัจจุบันไม่มี Column ที่ Resource กำลังเรียก

⑥ ตรวจ Column เฉพาะชื่อ

สามารถใช้:

SHOW COLUMNS
FROM `players`
LIKE 'citizenid';

ถ้าไม่มี Row กลับมา:

Column ไม่พบใน Table นี้

ตาม Schema ปัจจุบัน

MariaDB รองรับ LIKE กับ SHOW COLUMNS เพื่อกรองชื่อ Column.

⑦ ใช้ DESCRIBE ก็ได้

MariaDB ระบุว่า:

DESCRIBE `players`;

หรือ:

DESC `players`;

ทำหน้าที่เป็น Shortcut ของ SHOW COLUMNS สำหรับดู Column Definitions.

ดังนั้นเวลา Debug แบบเร็ว:

DESC `players`;

ก็ช่วยได้

⑧ แต่ควรดู SHOW CREATE TABLE ด้วย

ใช้:

SHOW CREATE TABLE `players`;

MariaDB ระบุว่า SHOW CREATE TABLE แสดง Definition เต็มที่ใช้สร้าง Table รวม Columns และโครงสร้างอื่นที่เกี่ยวข้อง.

ตัวอย่าง:

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

จะเห็นชัดว่าไม่มี:

citizenid

⑨ อย่าดูไฟล์ SQL อย่างเดียว

สมมติ Resource Folder มี:

`citizenid` VARCHAR(50)

ใน:

install.sql

ไม่ได้หมายความว่า Production Database มี Column นี้แล้ว

ต้องดู Database จริง:

SHOW CREATE TABLE `players`;

เพราะ SQL File กับ Schema ที่ถูก Importจริงอาจคนละ Version

⑩ สาเหตุอันดับต้นๆ คือ Migration ไม่ครบ

ตัวอย่าง:

Resource v1
players:
id
identifier
name

Resource v2 เพิ่ม:

metadata

Migration มี:

ALTER TABLE `players`
ADD COLUMN `metadata` LONGTEXT;

แต่ Server Owner Update Resource Files แล้วไม่ได้รัน Migration

Resource v2 เริ่ม Query:

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

Database v1 ไม่มี metadata

ผล:

Error 1054
Unknown column 'metadata'

นี่คือ Pattern:

Code ใหม่
+
Schema เก่า

⑪ อย่า ADD COLUMN จากชื่อ Error อย่างเดียว

เห็น:

Unknown column 'metadata'

แล้วทำทันที:

ALTER TABLE `players`
ADD COLUMN `metadata` TEXT;

อาจผิด

เพราะ Official Resource อาจกำหนด:

metadata LONGTEXT NOT NULL

หรือ:

metadata JSON

หรืออาจไม่ได้ต้องเพิ่ม Column เลย เพราะ Script ที่ใช้เป็นคนละ Framework

MariaDB รองรับ ALTER TABLE ... ADD COLUMN แต่ Column Definition ที่เพิ่มควรถูกต้องตาม Schema ที่ต้องการจริง.

⑫ ADD COLUMN ใช้เมื่อยืนยันแล้วเท่านั้น

ถ้า Official Migration ระบุชัดว่า:

ALTER TABLE `players`
ADD COLUMN `metadata` LONGTEXT NULL;

จึงค่อยใช้ Migration นั้น

MariaDB รองรับ:

ALTER TABLE
ADD COLUMN

รวมถึง IF NOT EXISTS ใน Syntax ที่รองรับ.

แต่ Production ควร Backup ก่อนเปลี่ยน Schema

⑬ Resource ใหม่กับ Schema เก่า

นี่คือสถานการณ์ที่พบได้บ่อยมาก:

เมื่อวาน
Resource v2 + Schema v2
= ปกติ

วันนี้
Update Resource → v3
Schema ยัง v2
= Unknown Column

ถ้า Error เริ่มทันทีหลัง Update ให้ตรวจ:

Migration
Upgrade SQL
Release Schema

ก่อนแก้ Lua Code

⑭ Schema ใหม่กับ Resource เก่าก็เกิดได้

ในทางกลับกัน Database อาจถูก Migration ไปแล้ว เช่น Rename:

identifier
→ citizenid

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

SELECT `identifier`
FROM `players`;

ผล:

Unknown column 'identifier'

นี่คือ:

Schema ใหม่
+
Code เก่า

ดังนั้น Error 1054 ไม่ได้แปลว่า Databaseเก่าเสมอไป

⑮ Column ถูก Rename

ตัวอย่าง Schema เดิม:

owner

Schema ใหม่:

identifier

Custom Resource ยังคง:

SELECT `owner`
FROM `vehicles`;

Databaseจึงหา owner ไม่พบ

MariaDB ALTER TABLE รองรับการแก้ชื่อ/Definition ของ Columns ตาม Syntax ที่กำหนด.

แต่ไม่ควร Rename Column กลับเพียงเพื่อให้ Custom Script ตัวเดียวทำงาน

ควรตรวจว่า Framework Version ปัจจุบันใช้ชื่อใดเป็นมาตรฐาน

⑯ Column ถูกลบหลัง Migration

บาง Resource Version อาจเลิกใช้ Column เดิม

เช่น:

old_character_id

ถูกยกเลิก

แต่ Script เสริมยังใช้:

WHERE `old_character_id` = ?

ผลคือ 1054

แก้ที่ Script เสริมให้รองรับ Schema ใหม่จะเหมาะกว่าการนำ Deprecated Column กลับมาโดยไม่มีเหตุผล

⑰ ชื่อ Column พิมพ์ผิด

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

identifier

แต่ Query เขียน:

identifer

ขาดตัว:

i

MariaDBไม่พบ Column และคืน Error 1054.

นี่เป็นเหตุผลที่ต้อง Copy ชื่อจาก:

SHOW COLUMNS FROM `players`;

แทนพิมพ์จากความจำ

⑱ ตัวพิมพ์เล็กใหญ่ของ Column

MariaDB Identifier Rules ไม่ควรถูกเหมารวมกับ Table-name Case Sensitivity ทุกกรณี แต่สิ่งที่ควรทำที่สุดคือใช้ Naming ให้ตรงกับ Schema จริงอย่างสม่ำเสมอ

เวลาตรวจ 1054 อย่าเดา

ใช้:

SHOW COLUMNS
FROM `table_name`;

เพื่อดูชื่อจริง.

⑲ Wrong Table แต่ Column ถูกชื่อ

สมมติ:

players.identifier

มีอยู่

แต่ Query:

SELECT `identifier`
FROM `jobs`;

Table jobs ไม่มี identifier

MariaDBก็สามารถคืน Unknown Column

ดังนั้นอย่าตรวจเพียงว่า:

Database มี Column identifier ที่ไหนสักแห่งหรือไม่

ต้องตรวจว่า Column อยู่ Table ที่ Queryกำลังอ้างจริงหรือไม่

⑳ ใช้ information_schema.COLUMNS ตรวจได้

MariaDB มี:

information_schema.COLUMNS

ซึ่งเก็บ Metadata ของ Columns เช่น:

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 COLUMN_NAME = 'citizenid';

ใช้ดูว่า citizenid มีอยู่ใน Table ใดบ้าง

㉑ ตรวจใน Database ปัจจุบันเท่านั้น

ถ้าต้องการจำกัด Database:

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

ช่วยป้องกันการเห็น Columnจาก:

fivem_backup

แล้วคิดว่ามีอยู่ใน:

fivem

㉒ Error หลัง Restore Database

ตัวอย่าง:

Resource Files = วันนี้
Database Backup = 3 เดือนก่อน

Resource ปัจจุบันคาด:

metadata
last_seen
account_id

แต่ Backup เก่ายังไม่มี

Restore เสร็จแล้ว FiveMอาจขึ้น Unknown Columnหลายตัวต่อเนื่อง

ทางแก้คือ Apply Migrations ตั้งแต่ Versionของ Backupจนถึง Resource Versionปัจจุบัน

ไม่ควร ADD Columns แบบไล่ตาม Error ทีละตัวโดยไม่รู้ Migration History

㉓ Error หลัง Import install.sql เก่า

ถ้าดาวน์โหลด Resource รุ่นใหม่ แต่ Import:

install.sql

จาก ZIP รุ่นเก่า

คุณอาจได้:

Resource v5
Schema v2

ผลคือ 1054

ให้ยืนยัน SQL Schema/Migration มาจาก Releaseเดียวกับ Resource Files

㉔ Error หลังเปลี่ยน Framework

ตัวอย่าง Framework A ใช้:

citizenid

แต่ Framework B ใช้:

identifier

Custom Resourceถูกเขียนสำหรับ Framework A แล้วนำมาใช้กับ B

Query:

SELECT `citizenid`
FROM `users`;

แต่ Database Framework B มี:

identifier

Result:

Unknown column 'citizenid'

กรณีนี้ไม่ควร ADD citizenid ทันที

ต้องตรวจว่า Resourceรองรับ Framework B จริงหรือไม่

㉕ อย่าสร้าง Columns ซ้ำซ้อนเพื่อประนีประนอม Scripts

วิธีแก้ที่เสี่ยง:

Framework ใช้ identifier
Script A ใช้ citizenid

→ เพิ่มทั้ง identifier และ citizenid

แล้วไม่มี Synchronization

ต่อมาจะเกิด:

identifier = Player A
citizenid = NULL

หรือค่าคนละ Player

ควรให้ Resourceทั้งหมดใช้ Data Model ที่ชัดเจน มากกว่าสร้าง Columnsซ้ำเพื่อให้ Errorหาย

㉖ Alias ผิดก็เกิด Unknown Column ได้

ตัวอย่าง:

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

ถ้า Developerเขียน:

SELECT
    x.identifier

แต่ไม่มี Alias:

x

Queryก็ผิด Context

ดังนั้น Error 1054 ไม่ได้หมายถึง Columnต้องไม่มีใน Databaseเสมอไป บางครั้งการอ้าง Table/Alias ใน SQLผิดต่างหาก

㉗ JOIN ต้องดูว่า Column อยู่ฝั่งไหน

ตัวอย่าง:

SELECT *
FROM `players` p
JOIN `vehicles` v
    ON p.plate = v.plate;

แต่ players ไม่มี:

plate

ในขณะที่ vehicles มี

ต้องแก้ Join Condition

ไม่ใช่เพิ่ม plate เข้า players เพียงเพื่อหยุด Error

㉘ WHERE Clause ก็เกิดได้

ตัวอย่าง:

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

แต่ Table มี:

identifier

MariaDBจะไม่พบ citizenid

Root Cause คือ Queryใช้ Column Nameคนละ Version

㉙ ORDER BY ก็ต้องใช้ Column ที่ Query รู้จัก

Query:

SELECT
    `id`,
    `name`
FROM `characters`
ORDER BY `created_at` DESC;

ถ้า Tableไม่มี created_at ก็มีปัญหาได้

ดังนั้นเมื่อ Debug ให้ Copy SQL ทั้ง Statement

อย่าดูเฉพาะ SELECT List

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

ตัวอย่าง:

INSERT INTO `characters`
(
    `identifier`,
    `firstname`,
    `lastname`,
    `metadata`
)
VALUES
(
    ?,
    ?,
    ?,
    ?
);

ถ้า Databaseไม่มี:

metadata

INSERT จะไม่สามารถทำงานได้

จุดนี้พบมากหลัง Resource Update เพิ่ม Field ใหม่

㉛ UPDATE ก็เกิดได้

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

ถ้า last_seen ยังไม่ได้ถูกเพิ่มจาก Migration:

1054
Unknown column

ดังนั้น Errorอาจเกิดเฉพาะตอน Save/Logout ทั้งที่ Loginปกติ

㉜ Error เกิดเฉพาะบาง Feature

ตัวอย่าง:

Login
ปกติ

Garage
ปกติ

เปิด Wardrobe
→ Unknown column outfit_data

มีเหตุผลให้ตรวจ Resource Wardrobe และ Migration ของมันก่อน

ไม่ควร Repair Databaseทั้งระบบ

㉝ Error เกิดกับทุก Feature หลัง Update

ถ้าหลาย Resourcesเริ่ม Unknown Columnพร้อมกันหลัง Restore/ย้าย Server ให้สงสัย:

Database Schema เก่า
Wrong Database
Incomplete Migration
Wrong Backup

เป็น Root Causeกลาง

แทน Debug Resources ทีละตัว

㉞ วิธีหา Query ที่ทำ Error

oxmysql Debug UI สามารถแสดง Queries ที่ Resources Execute, Query Response Time และ Statistics ต่อ Resource และสามารถดู Full Query ในหน้าของ Resourceได้.

ดังนั้นใช้เพื่อหา:

Resource ไหน
↓
Query อะไร
↓
Column ไหน

จะเร็วกว่า Search Source Code ทั้ง Server แบบสุ่ม

㉟ mysql_debug ใช้ได้

oxmysql ระบุว่า Query Speeds/Debug Information สามารถแสดงใน Server Console เมื่อ mysql_debug เปิดใช้งาน.

เมื่อตรวจ Error 1054 ให้หา Query รอบเวลาที่ Error เกิด

จากนั้น Copy SQL ไปเทียบกับ:

SHOW COLUMNS

ของ Table จริง

㊱ Placeholder ไม่สามารถใช้แก้ชื่อ Column ผิดได้

oxmysql Placeholders ใช้ส่ง Values แยกจาก SQL Structure และ Documentation แสดงการใช้ ? กับค่าต่างๆ.

ตัวอย่างถูก:

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

แต่ไม่ควรคิดว่า:

SELECT ?
FROM `players`

แล้วส่งชื่อ Column ผ่าน Value Parameter จะกลายเป็น Dynamic Column Name ตามที่ต้องการ

SQL Identifiers กับ Values เป็นคนละส่วนของ Query

㊲ Dynamic Column Name ต้องระวัง

ถ้าจำเป็นต้องเลือก Column แบบ Dynamic:

name
job
level

ควรใช้ Server-side Whitelist เช่น:

local allowedColumns = {
    name = '`name`',
    job = '`job`',
    level = '`level`'
}

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

ไม่ควรให้ Clientส่งชื่อ Column แล้วนำมาต่อ Queryตรงๆ

นอกจากลด 1054 ยังลดความเสี่ยงจาก Dynamic SQL ที่ไม่ปลอดภัย

㊳ Column ใหม่ต้องมี Data Type ถูกต้อง

ถ้ายืนยันว่า Migration ต้องเพิ่ม:

last_seen

อย่าเพียงทำ:

ALTER TABLE `players`
ADD COLUMN `last_seen` VARCHAR(255);

เพราะชื่อถูกแต่ Type อาจผิด

Official Schemaอาจต้องการ:

DATETIME
TIMESTAMP
BIGINT

การสร้าง Typeผิดอาจทำให้ Error 1054 หาย แล้วไปเกิด:

1292
1366
1406

แทน

㊴ ADD COLUMN ตาม Official Migration

MariaDB รองรับ:

ALTER TABLE `players`
ADD COLUMN `last_seen` DATETIME NULL;

ตาม Column Definition ที่ต้องการ.

แต่ Production ควร:

Backup
↓
Test Migration
↓
ALTER
↓
SHOW CREATE TABLE
↓
Verify Resource

㊵ หลัง ALTER ต้อง Verify

หลัง Migration ใช้:

SHOW COLUMNS
FROM `players`
LIKE 'last_seen';

และ:

SHOW CREATE TABLE `players`;

MariaDB มีทั้งสองคำสั่งเพื่อดู Columns และ Definition ของ Table.

อย่าเชื่อเพียงว่า Query:

Query OK

แล้วจบ

㊶ Column อยู่แต่ Type ผิดไม่ใช่ 1054 แล้ว

สมมติหลังสร้าง:

metadata

แล้ว 1054 หาย

แต่ Resourceส่ง JSON ขนาดใหญ่ลง:

VARCHAR(100)

อาจเปลี่ยนไปเป็น Error:

Data too long

นี่แสดงว่า Schemaยังไม่ถูก แม้ Columnจะมีแล้ว

ดังนั้น Goal ไม่ใช่:

ทำให้ชื่อ Column มีอยู่

แต่คือ:

ทำให้ Schema ตรงกับ Resource Version

㊷ Unknown Column หลัง Rename ต้องแก้ทุก Resource

ถ้า Migration:

owner
→ identifier

ให้ค้น Scripts ที่ยังมี:

`owner`

เช่น:

garage
housing
inventory
phone
banking
custom jobs

ไม่เช่นนั้น Resourceแรกอาจหาย Error แต่ Resourceอื่นจะยัง 1054 ต่อ

㊸ อย่า Rename กลับไปกลับมา

หาก Frameworkมาตรฐานใหม่ใช้:

identifier

แต่ Custom Scriptเก่าใช้:

owner

การ Rename Databaseกลับเป็น owner อาจทำ Frameworkหลักพัง

ควรแก้ Compatibility Layer หรือ Custom Script ตาม Architecture ปัจจุบัน

㊹ Error หลัง Restore Backup ต้อง Migration เป็นลำดับ

สมมติ:

Backup = v1
Current Resource = v5

Migrationมี:

v1 → v2
v2 → v3
v3 → v4
v4 → v5

อย่าเลือกเฉพาะ SQL ที่เห็นว่ามีชื่อ Columnใน Errorแล้วรัน

Migrationบางขั้นอาจ:

สร้าง Table
เปลี่ยนชื่อ Column
Backfill Data
เพิ่ม Index
ลบ Legacy Column

ซึ่งต้องทำตามลำดับ

㊺ Unknown Column จาก Database ผิดตัว

Serverอาจมี:

fivem
fivem_old
fivem_test

Resourceเชื่อม:

fivem_old

ซึ่งมี Table players แต่ Schemaเก่า

ดังนั้นจะไม่ขึ้น:

Table doesn't exist

แต่ขึ้น:

Unknown column

เพราะ Tableมี แต่เป็นคนละ Version

นี่เป็นเหตุผลที่ 1054 ควรตรวจ Database Connectionด้วยเช่นกัน

㊻ oxmysql Connection String ต้องตรง

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

ดังนั้นถ้า Schemaที่ถูกต้องอยู่:

fivem

แต่ FXServerชี้:

fivem_old

คุณสามารถเห็น Unknown Column แม้ phpMyAdmin ใน Databaseหลักจะมี Columnนั้นครบแล้ว

㊼ Error เฉพาะ Production แต่ Dev ใช้ได้

ให้เปรียบเทียบ:

Resource commit/version
Database schema
Migration history
Database name

ระหว่าง:

Development
Production

ไม่ควร Copy Databaseจาก Devมาทับ Productionเพียงเพื่อให้ Schemaตรง เพราะข้อมูล Productionอาจหาย

ควรทำ Migrationอย่างเป็นระบบ

㊽ วิธีเปรียบเทียบ Schema แบบง่าย

บน Database A:

SHOW CREATE TABLE `players`;

บน Database B:

SHOW CREATE TABLE `players`;

แล้วเปรียบเทียบ:

Columns
Types
NULL
DEFAULT
Indexes

MariaDB SHOW CREATE TABLE เหมาะสำหรับดู Definitionเต็มของ Table.

㊾ ใช้ information_schema หา Missing Columns หลาย Table

ตัวอย่างค้น:

SELECT
    TABLE_NAME,
    COLUMN_NAME,
    DATA_TYPE
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
ORDER BY TABLE_NAME, ORDINAL_POSITION;

MariaDB information_schema.COLUMNS มี Metadata Columns ของทุก Table ใน Schema.

เหมาะกับการทำ Schema Audit หลัง Migration ใหญ่

㊿ อย่าทำ ALTER Production จาก Console Error เพียงบรรทัดเดียว

ก่อน:

ALTER TABLE ...

ควรมีอย่างน้อย:

① Error เต็ม
② Query เต็ม
③ SHOW CREATE TABLE
④ Official Schema/Migration
⑤ Backup

เพราะ Error:

Unknown column 'x'

อาจเกิดจาก Queryผิด

ไม่จำเป็นต้องเกิดจาก Databaseขาด Columnเสมอไป

51. วิธีแก้แบบ 5 นาที

ถ้าเห็น:

Unknown column 'metadata' in 'field list'

ทำ:

① จด Column = metadata
② จด Resource
③ จด Table
④ SHOW COLUMNS FROM table
⑤ SHOW CREATE TABLE table
⑥ เปิด oxmysql Debug ดู Query
⑦ เทียบ Resource Version
⑧ หา Migration SQL
⑨ ตรวจ Database Connection
⑩ ถ้า Migration ระบุจริง จึงเพิ่ม/แก้ Column

52. ตัวอย่าง Case 1 — Migration ไม่ครบ

Console:

Unknown column 'last_seen'
in 'field list'

Database:

SHOW COLUMNS FROM `players`;

ไม่มี:

last_seen

Official Migration ของ Resource Versionปัจจุบันระบุให้เพิ่ม last_seen

Root Cause:

Migration ไม่ได้รัน

ใช้ Migration Versionที่ถูกต้อง

53. ตัวอย่าง Case 2 — Query พิมพ์ผิด

Database:

identifier

Resource Query:

SELECT `identifer`
FROM `players`;

Root Cause:

Typo

ทางแก้:

แก้ Resource Query

ไม่ใช่:

ADD COLUMN identifer

54. ตัวอย่าง Case 3 — Framework คนละตัว

Resource Query:

SELECT `citizenid`
FROM `players`;

แต่ Serverใช้ Frameworkที่ Schemaเป็น:

identifier

Root Cause:

Resource ไม่ตรง Framework/Data Model

ต้องใช้ Resource Version/Configuration ที่รองรับ Frameworkนั้น

55. ตัวอย่าง Case 4 — Database เก่า

FXServer Connection:

fivem_old

phpMyAdmin ที่ Adminเปิดดู:

fivem

ใน fivem มี:

metadata

แต่ fivem_old ไม่มี

FiveMจึงยัง 1054

แก้ Connection Stringให้ชี้ Databaseที่ถูกต้องหลังตรวจข้อมูลและ Backupเรียบร้อย

56. ตัวอย่าง Case 5 — Column Rename

Resourceใหม่ใช้:

identifier

Custom Resourceเก่าใช้:

owner

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

ตรวจ Official Migrationว่า owner ถูก Rename/Deprecated จริงหรือไม่

ถ้าใช่ ให้ Update Custom Script

57. Checklist FiveM Error 1054

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

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

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

  3. Column ที่หายชื่ออะไร

  4. Error บอก field list, where, on หรือ Context ใด

  5. Resource ไหนเป็นคน Query

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

  7. Table ไหน

  8. Table มีอยู่หรือไม่

  9. SHOW COLUMNS พบ Column หรือไม่

  10. SHOW CREATE TABLE เป็น Schema Versionไหน

  11. Column พิมพ์ผิดหรือไม่

  12. Table Alias ถูกหรือไม่

  13. JOIN อ้าง Tableถูกฝั่งหรือไม่

  14. WHERE ใช้ Columnถูกหรือไม่

  15. ORDER BY ใช้ Columnที่มีหรือไม่

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

  17. UPDATE SET ใช้ Columnที่มีหรือไม่

  18. Resource Version คืออะไร

  19. Migration Version คืออะไร

  20. Migration ครบหรือไม่

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

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

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

  24. Framework เปลี่ยนหรือไม่

  25. Schema มาจาก Frameworkอื่นหรือไม่

  26. Database Connectionชี้ตัวถูกหรือไม่

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

  28. Dev กับ Production Schemaต่างกันหรือไม่

  29. Column Type ตาม Official Schemaหรือไม่

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

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

Errorความหมายหลัก
1048Column ห้าม NULL แต่ได้รับ NULL
1054Unknown Column
1060Duplicate Column Name
1062Duplicate Entry
1064SQL Syntax Error
1146Table Doesn't Exist
1264Out of Range
1265Data Truncated
1292Incorrect/Truncated Value
1364Field ไม่มี Default
1366Incorrect Value
1406Data Too Long

MariaDB Error Reference แยก 1054 เป็น ER_BAD_FIELD_ERROR และ 1060 เป็น Duplicate Column Name จึงต้องระวังไม่ ADD Column ซ้ำเมื่อกำลังแก้ Schema.

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

เริ่มจาก:

SHOW COLUMNS FROM `table_name`;

แล้วดูว่า Columnใน Errorมีจริงหรือไม่.

จากนั้น:

SHOW CREATE TABLE `table_name`;

เพื่อดู Definitionทั้งหมด.

ถ้าไม่มีจริง อย่า ADD ทันที

ให้ตรวจ Migration ของ Resourceก่อน

FiveM Error 1054 คืออะไร

MariaDB Error 1054 คือ:

ER_BAD_FIELD_ERROR

SQLSTATE:

42S22

ข้อความ:

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

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

โดยมากคือ Queryอ้าง Columnที่ไม่พบใน Contextของ Field List เช่น SELECT/INSERT/UPDATE

ให้ตรวจ:

Column Name
Table
Alias
Schema Version

ก่อน

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

ตรวจ:

Resource Version
↓
Migration
↓
SHOW CREATE TABLE

หาก Resourceใหม่เพิ่ม Column แต่ Databaseยัง Schemaเก่า ให้ Apply Migrationที่ตรง Version

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

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

ตรวจ Data Modelก่อนว่า Frameworkปัจจุบันใช้:

identifier
citizenid
charid
player_id

แบบใด

หาก Resourceสร้างมาสำหรับ Frameworkอื่น ให้ใช้ Compatibility Configuration หรือ Resource Versionที่รองรับ

อย่าเพิ่ม Columnsของ Frameworkอื่นเข้า Databaseแบบสุ่ม

FiveM Unknown Column ทั้งที่ Column มีอยู่

ตรวจ:

Database ที่ FiveM เชื่อมจริง
Table Alias
Table ที่ Queryใช้

โดยเฉพาะกรณีมี:

fivem
fivem_test
fivem_old

oxmysql Connection String เป็นตัวกำหนด Database ที่ Resourceใช้งาน.

FiveM เพิ่ม Column ด้วย ALTER TABLE ได้ไหม

ได้ MariaDBรองรับ:

ALTER TABLE `table_name`
ADD COLUMN `column_name` VARCHAR(100);

แต่ควรทำเฉพาะเมื่อ Official Schema/Migrationยืนยัน:

Column Name
Data Type
NULL
DEFAULT
INDEX

ครบแล้ว

FiveM เช็ก Column ด้วย information_schema ยังไง

ตัวอย่าง:

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

MariaDB information_schema.COLUMNS ให้ข้อมูล Metadata ของ Columnsทั่ว Server.

FiveM ดู Query ที่ Error จาก oxmysql ยังไง

oxmysql Debug UI แสดง Queries ที่แต่ละ Resource Execute และสามารถดู Full Query รวมทั้ง Timingได้.

นอกจากนี้ Server Consoleสามารถแสดง Query Debugเมื่อเปิด mysql_debug.

ใช้ข้อมูลนี้เทียบกับ Schemaจริงแทนการเดา

FiveM Unknown Column ต้อง Restart MariaDB ไหม

ถ้า Root Causeคือ:

Column ไม่มี
Query ผิด
Migration ไม่ครบ

Restart MariaDBไม่ได้แก้ Schema

แก้ Query หรือ Migrationให้ถูกต้องก่อน

FiveM Unknown Column ต้องลง oxmysql ใหม่ไหม

โดยทั่วไปไม่

Error 1054 เป็น Errorที่ MariaDBคืนเกี่ยวกับ Columnที่ Queryอ้างถึง ส่วน oxmysqlเป็นตัว Execute Query

ให้ตรวจ Query และ Schemaก่อนสรุปว่า Database Driverเสีย

FAQ FiveM MariaDB Unknown Column

Error 1054 คืออะไร?

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

Unknown Column กับ Table Doesn't Exist เหมือนกันไหม?

ไม่ Error 1054 คือ Columnไม่พบ ส่วน Error 1146 คือ Tableไม่พบ.

เช็กว่า Column มีหรือไม่อย่างไร?

ใช้:

SHOW COLUMNS FROM `table_name`;

ดู Table Schemaเต็มได้อย่างไร?

ใช้:

SHOW CREATE TABLE `table_name`;

Unknown Column หลัง Update มักเกิดจากอะไร?

หนึ่งในสาเหตุสำคัญคือ Resource Versionใหม่แต่ Migration/Schemaยังเป็น Versionเก่า

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

ไม่ ควรหา Official Migrationหรือ Schemaที่ตรง Resource Versionก่อน

Columnมีอยู่แต่ยัง Errorได้ไหม?

ได้ ถ้า FiveMเชื่อม Databaseคนละตัว, Queryใช้ Table/Aliasผิด หรือ Columnนั้นอยู่คนละ Table

Unknown Column หลังเปลี่ยน Framework ต้องทำอย่างไร?

ตรวจว่าชื่อ Identifier/Columnsของ Frameworkใหม่ตรงกับ Resourceหรือไม่ และใช้ Resource/Configurationที่รองรับ Frameworkนั้น

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

ได้ ช่วยดู Queries ที่ Resources Executeผ่าน oxmysql.

Placeholder ช่วยแก้ชื่อ Columnได้ไหม?

Placeholderของ oxmysqlใช้สำหรับ Values ไม่ควรถูกใช้เป็นตัวแทน Dynamic SQL Identifier แบบสุ่ม.

ALTER TABLE เพิ่ม Columnได้ไหม?

ได้ MariaDBรองรับ ADD COLUMN ผ่าน ALTER TABLE.

ต้อง Backup ก่อน Migrationไหม?

สำหรับ Production Database ควรมี Backupและ Rollback Plan ก่อน Schema Change โดยเฉพาะ Tables ที่เก็บ Character, Vehicle หรือ Player Data

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

เมื่อ FiveM ขึ้น:

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

ให้ใช้ Flow:

1054
↓
ดูชื่อ Column
↓
ดู Resource + Query
↓
SHOW COLUMNS
↓
SHOW CREATE TABLE
↓
ดู Database ที่ FiveM ใช้
↓
เทียบ Resource Version
↓
เทียบ Migration
↓
ตรวจ Rename / Typo / Alias
↓
จึงค่อย ALTER หรือแก้ Query

MariaDB กำหนด Error 1054 ว่าเป็น ER_BAD_FIELD_ERROR และมีเครื่องมืออย่าง SHOW COLUMNS, SHOW CREATE TABLE และ information_schema.COLUMNS สำหรับตรวจ Column และ Schemaจริงของ Database.

สำหรับ FiveM สิ่งสำคัญที่สุดคือ อย่าสร้าง Columnใหม่เพียงเพื่อให้ Errorหาย เพราะหาก Queryพิมพ์ผิด, Scriptใช้ Frameworkคนละตัว หรือ Databaseชี้คนละ Version การ ADD Columnจะทำให้ Schemaยิ่งผิดจากมาตรฐาน

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

Comments

Popular posts from this blog

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

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

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