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
ตรวจทั้งหมดนี้:
Error Code เป็น
1054หรือไม่SQLSTATE เป็น
42S22หรือไม่Column ที่หายชื่ออะไร
Error บอก
field list,where,onหรือ Context ใดResource ไหนเป็นคน Query
Query เต็มคืออะไร
Table ไหน
Table มีอยู่หรือไม่
SHOW COLUMNSพบ Column หรือไม่SHOW CREATE TABLEเป็น Schema VersionไหนColumn พิมพ์ผิดหรือไม่
Table Alias ถูกหรือไม่
JOIN อ้าง Tableถูกฝั่งหรือไม่
WHERE ใช้ Columnถูกหรือไม่
ORDER BY ใช้ Columnที่มีหรือไม่
INSERT Column List ถูกหรือไม่
UPDATE SET ใช้ Columnที่มีหรือไม่
Resource Version คืออะไร
Migration Version คืออะไร
Migration ครบหรือไม่
Column ถูก Renameหรือไม่
Column ถูก Dropหรือไม่
Custom Script เก่าหรือไม่
Framework เปลี่ยนหรือไม่
Schema มาจาก Frameworkอื่นหรือไม่
Database Connectionชี้ตัวถูกหรือไม่
Backup/Restore เก่าหรือไม่
Dev กับ Production Schemaต่างกันหรือไม่
Column Type ตาม Official Schemaหรือไม่
Backup ก่อน ALTER แล้วหรือไม่
ตาราง Error ที่ควรแยกให้ออก
| Error | ความหมายหลัก |
|---|---|
1048 | Column ห้าม NULL แต่ได้รับ NULL |
1054 | Unknown Column |
1060 | Duplicate Column Name |
1062 | Duplicate Entry |
1064 | SQL Syntax Error |
1146 | Table Doesn't Exist |
1264 | Out of Range |
1265 | Data Truncated |
1292 | Incorrect/Truncated Value |
1364 | Field ไม่มี Default |
1366 | Incorrect Value |
1406 | Data 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
Post a Comment