FiveM MariaDB Unknown Column แก้อย่างไร? วิธีแก้ Error 1054 เมื่อ Resource กับ Database Schema คนละ Version
FiveM MariaDB Unknown column คือ Error ที่เกิดเมื่อ SQL Query จาก Resource อ้างถึง Column ที่ MariaDB หาไม่พบใน Table หรือ Context ที่กำลัง Query โดย MariaDB กำหนดเป็น Error 1054, SQLSTATE 42S22 และชื่อ ER_BAD_FIELD_ERROR พร้อมข้อความรูปแบบ Unknown column '...' in '...'.
ตัวอย่างที่พบใน FiveM:
ERROR 1054 (42S22):
Unknown column 'citizenid' in 'field list'
หรือ:
Unknown column 'metadata' in 'field list'
Unknown column 'owner' in 'where clause'
Unknown column 'job_grade' in 'field list'
Unknown column 'players.identifier' in 'on clause'
กรณีนี้ต่างจาก Table doesn't exist เพราะ Table อาจมีอยู่เรียบร้อยแล้ว แต่ Column ที่ Resource ต้องการไม่มี ชื่อไม่ตรง หรือ Query อ้าง Alias/Column ผิด
สาเหตุสำคัญใน FiveM มักเป็น:
Resource ใหม่ + Database Schema เก่า
Migration SQL ยังไม่ได้รัน
Column ถูก Rename
Custom Script ใช้ Schema คนละ Framework
ติดตั้ง Script ไม่ครบ
Import SQL ผิด Version
Query พิมพ์ชื่อ Column ผิด
Table Alias ผิด
JOIN ผิด Table
Resource ใช้ Column รุ่นเก่าที่ถูกลบแล้ว
Database Restore จาก Backup เก่า
แนวทางตรวจที่ถูกต้องคือ:
Error 1054
↓
ดูชื่อ Column
↓
ดูว่า Error อยู่ field list / where / on / order
↓
ดู Query ที่ Resource ส่งจริง
↓
SHOW COLUMNS
↓
SHOW CREATE TABLE
↓
เทียบกับ Resource Version
↓
ตรวจ Migration
↓
แก้ Query หรือ Schema ให้ตรงกัน
① Error 1054 คืออะไร
MariaDB ระบุ Error:
1054
42S22
ER_BAD_FIELD_ERROR
Unknown column '%s' in '%s'
ตัวอย่าง:
SELECT
`identifier`,
`citizenid`
FROM `players`;
แต่ Table จริงมีเพียง:
id
identifier
name
และไม่มี:
citizenid
MariaDB จึงไม่สามารถ Resolve ชื่อ Column ได้และคืน Error 1054
② Unknown Column ต่างจาก Table Doesn't Exist อย่างไร
จากบทความก่อน:
1146
Table doesn't exist
หมายถึง Object ระดับ Table ที่ Query ต้องการไม่มี
แต่:
1054
Unknown column
หมายถึง MariaDB ไม่สามารถหา Column ตามชื่อที่ Query อ้างถึงใน Context นั้นได้.
จำง่ายๆ:
1146
หา Table ไม่เจอ
1054
หา Column ไม่เจอ
③ Unknown Column in 'field list' คืออะไร
ตัวอย่าง:
Unknown column 'citizenid' in 'field list'
มักสัมพันธ์กับ Column ที่ถูกอ้างในรายการ SELECT, INSERT, UPDATE หรือ Expression ที่ MariaDBกำลังประมวลผล
ตัวอย่าง:
SELECT
`id`,
`citizenid`,
`name`
FROM `players`;
ถ้า citizenid ไม่มีใน players Query จะไม่สามารถทำงานตามที่เขียนไว้ได้
สิ่งแรกที่ควรทำคือ:
SHOW COLUMNS FROM `players`;
MariaDB ระบุว่า SHOW COLUMNS ใช้แสดงข้อมูล Columns ของ Table และ DESCRIBE ให้ข้อมูลใกล้เคียงกัน.
④ Unknown Column in 'where clause' คืออะไร
ตัวอย่าง:
SELECT *
FROM `players`
WHERE `citizenid` = ?;
แต่ Table ไม่มี citizenid
Error อาจแสดง:
Unknown column 'citizenid'
in 'where clause'
กรณีนี้อย่าตรวจเฉพาะ Columns ใน SELECT
ต้องตรวจทุกชื่อที่อยู่ใน:
WHERE
JOIN
ORDER BY
GROUP BY
HAVING
SET
ด้วย
⑤ Unknown Column in 'on clause' คืออะไร
มักเกี่ยวกับ JOIN
ตัวอย่าง:
SELECT *
FROM `players` p
JOIN `vehicles` v
ON v.citizenid = p.citizenid;
ถ้า:
vehicles.citizenid
ไม่มี หรือ:
players.citizenid
ไม่มี
MariaDB ก็ไม่สามารถ Resolve JOIN Condition ได้
กรณีนี้ต้องตรวจ ทั้งสอง Tables
SHOW COLUMNS FROM `players`;
SHOW COLUMNS FROM `vehicles`;
ไม่ใช่ตรวจเพียง Table ตัวแรก
⑥ FiveM Error 1054 หลัง Update Script
นี่เป็นหนึ่งในสถานการณ์ที่ควรสงสัย Migration ไม่ครบ มากที่สุด
ตัวอย่าง:
Resource v1
ใช้:
identifier
ต่อมา Resource v2 เพิ่ม:
citizenid
แต่ Server Owner Update:
resource files
อย่างเดียว
โดยไม่ทำ:
database migration
Resource v2 จึง Query:
SELECT `citizenid`
FROM `players`;
ขณะที่ Database ยังเป็น Schema v1
ผล:
Error 1054
ดังนั้นหาก Error เริ่มทันทีหลัง Update อย่ารีบเพิ่ม Column จากการเดา ให้ตรวจ Migration ของ Resource Version นั้นก่อน
⑦ วิธีตรวจ Columns จริง
ใช้:
SHOW COLUMNS FROM `players`;
MariaDB ระบุว่า SHOW COLUMNS แสดงข้อมูล เช่น Field, Type, Nullability, Key, Default และ Extra ของ Columns.
ตัวอย่าง:
id
identifier
firstname
lastname
metadata
created_at
ถ้า Resource Error:
Unknown column 'citizenid'
และรายการจริงไม่มี:
citizenid
แสดงว่าปัญหาได้รับการยืนยันในระดับ Schema แล้ว
⑧ ใช้ DESCRIBE ได้ไหม
ได้
DESCRIBE `players`;
หรือ:
DESC `players`;
MariaDB ระบุว่า DESCRIBE ทำหน้าที่เป็น Shortcut สำหรับข้อมูลลักษณะเดียวกับ SHOW COLUMNS.
ดังนั้นเวลาตรวจเร็วๆ ใช้:
DESC players;
ก็ได้
⑨ SHOW CREATE TABLE สำคัญกว่าแค่ดูชื่อ Column
ใช้:
SHOW CREATE TABLE `players`;
MariaDB ระบุว่าคำสั่งนี้แสดง CREATE TABLE Definition ของ Table ปัจจุบัน.
จึงช่วยดูได้พร้อมกันว่า:
Column มีหรือไม่
Data Type คืออะไร
DEFAULT คืออะไร
NULL / NOT NULL
PRIMARY KEY
UNIQUE KEY
INDEX
Generated Column
ดังนั้นหลังตรวจพบว่า Column มีอยู่หรือไม่มี ควรดู Definition ด้วยถ้ากำลังเทียบ Migration
⑩ อย่าดู install.sql อย่างเดียว
Resource Folder อาจบอก:
`citizenid` varchar(50) NOT NULL
แต่ Production Database อาจไม่มี Column นี้จริง
หรือกลับกัน:
Database มี citizenid
แต่ Resource ที่กำลังรันยังใช้:
identifier
Schema File และ Database จริงอาจต่างกันเพราะ:
Migration ไม่ครบ
Admin ALTER เอง
Restore Backup เก่า
เคยเปลี่ยน Framework
ดังนั้น Database จริงคือสิ่งที่ต้องตรวจด้วย:
SHOW CREATE TABLE `players`;
⑪ ใช้ information_schema.COLUMNS ตรวจทั้ง Database
MariaDB มี information_schema.COLUMNS ซึ่งเก็บ Metadata ของ Columns ใน Tables บน Server รวมถึง Database, Table, Column, Data Type, Default และ Nullability.
ตัวอย่างค้น Column ชื่อเดียวกัน:
SELECT
TABLE_SCHEMA,
TABLE_NAME,
COLUMN_NAME,
COLUMN_TYPE
FROM information_schema.COLUMNS
WHERE COLUMN_NAME = 'citizenid';
ช่วยตอบว่า:
citizenid
มีอยู่ใน Table ไหนบ้าง
⑫ ตรวจ Column ภายใน Database ปัจจุบัน
สามารถใช้:
SELECT
TABLE_NAME,
COLUMN_NAME,
COLUMN_TYPE
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND COLUMN_NAME = 'citizenid';
ถ้าไม่พบเลย:
Column นี้ไม่มีใน Database ปัจจุบัน
หากพบใน:
characters
แต่ Resource Query:
players.citizenid
อาจหมายถึง Query เลือก Table ผิด
⑬ Table มี Column แต่ Resource ยังบอก Unknown Column
กรณีนี้ตรวจต่อ:
① FiveM ใช้ Database เดียวกับที่คุณกำลังเปิดหรือไม่
② Query ใช้ Table เดียวกันหรือไม่
③ Alias ถูกหรือไม่
④ Column Case/ชื่อสะกดตรงหรือไม่
⑤ Resource Query ถูก Cache/Version เก่าหรือไม่
oxmysql Connection String เป็นตัวกำหนด Database ที่ Resource เชื่อม และ Official Setup ระบุให้กำหนด Connection String ก่อน Resources ที่ใช้งาน Database.
ตัวอย่าง:
database=fivem
แต่คุณกำลังดู:
fivem_backup
ก็อาจเห็น Column ทั้งที่ FiveM หาไม่เจอ
⑭ Resource กับ Database คนละ Version
ตัวอย่าง:
Resource v5
Database Schema v3
Resourceต้องการ:
citizenid
last_seen
metadata
แต่ Databaseมีเพียง:
identifier
name
การแก้ทีละ Error เช่น:
ADD citizenid
แล้ว Restart
จากนั้น:
ADD last_seen
แล้ว Restart
ไม่ใช่วิธีที่ดี
เพราะคุณกำลังสร้าง Schema จาก Error Messagesทีละ Column
ควรหา Migration จาก v3 → v4 → v5 ให้ครบ
⑮ อย่า ADD COLUMN จากการเดา
เห็น:
Unknown column 'metadata'
แล้วทำ:
ALTER TABLE `players`
ADD COLUMN `metadata` TEXT;
ทันทีอาจผิด
Official Schema อาจต้องการ:
LONGTEXT
JSON
NOT NULL
DEFAULT
INDEX
หรือ Resource Versionใหม่อาจไม่ได้ต้องการ Columnนี้เลย แต่ Queryมาจาก Scriptเก่า
ดังนั้นชื่อ Column เพียงอย่างเดียวไม่เพียงพอสำหรับสร้าง Schema
⑯ ตรวจ Migration ก่อน ALTER TABLE
ลำดับที่ควรใช้:
Error 1054
↓
Resource Version
↓
Current Schema
↓
Official Migration
↓
Backup
↓
Migration
↓
SHOW CREATE TABLE
↓
Restart Resource
ไม่ใช่:
Error
↓
ALTER แบบเดา
⑰ Error หลังติดตั้ง Resource ใหม่
สมมติ Framework มี:
players
แต่ Resource ใหม่คาดว่า Table players ต้องมี:
citizenid
Resource อาจถูกออกแบบมาสำหรับ Framework คนละตัว
เช่น Resourceคาด Data Model แบบหนึ่ง แต่ Serverใช้ Frameworkอีกแบบ
ในกรณีนี้การเพิ่ม Column อาจไม่พอ เพราะ:
Identifier Logic
Character Model
Ownership
Tables
Events
อาจไม่เหมือนกันทั้งหมด
⑱ Framework Compatibility ต้องตรวจ
ก่อนติดตั้ง Resource Database-heavy ให้ตรวจว่า Script รองรับ Framework/Data Model ที่ Serverใช้อยู่หรือไม่
เพราะ Table ชื่อ:
players
เหมือนกันไม่ได้หมายความว่า Schemaเหมือนกัน
Resource A อาจใช้:
identifier
Resource B ใช้:
citizenid
Resource C ใช้:
charid
ดังนั้น Column Mapping ต้องมาจาก Resource Architectureจริง
⑲ Custom Script ใช้ Column เก่า
สมมติ Framework Migration เปลี่ยน:
identifier
เป็น:
citizenid
Official Resources ถูก Update หมดแล้ว
แต่ Custom Resource ยังมี:
SELECT *
FROM `players`
WHERE `identifier` = ?;
ผลคือ Error 1054
กรณีนี้ Database อาจถูกต้องแล้ว
สิ่งที่ต้องแก้คือ:
Custom Resource Query
ไม่ใช่เพิ่ม Columnเก่ากลับมาโดยอัตโนมัติ
⑳ อย่าเพิ่ม Legacy Column กลับมาโดยไม่จำเป็น
การเพิ่ม:
identifier
กลับเข้า Tableเพื่อให้ Scriptเก่าทำงาน อาจสร้าง Data Duplication เช่น:
citizenid
identifier
สอง Columnsแทน Entityเดียวกัน
จากนั้นเกิดคำถาม:
ตัวไหน Source of Truth?
ต้อง Sync สอง Column อย่างไร?
Scriptไหนอ่านตัวไหน?
แก้ Custom Resource ให้ใช้ Schemaปัจจุบันมักสะอาดกว่า
㉑ Column Rename ทำ Error ได้
สมมติเดิม:
player_name
Migrationใหม่เปลี่ยนเป็น:
name
แต่ Resourceเก่ายัง Query:
SELECT `player_name`
FROM `players`;
ก็เกิด 1054
ต้องค้นหา Resourceทั้งหมดที่ใช้ชื่อเก่า
㉒ ก่อน Rename Column ต้องตรวจ Dependencies
อย่าทำเพียง:
player_name
→ name
แล้วคิดว่าจบ
ตรวจ:
SELECT queries
INSERT queries
UPDATE queries
JOIN
Views
Triggers
Indexes
Custom Resources
Exports
เพราะ Queryตัวใดตัวหนึ่งยังใช้ชื่อเดิมก็เกิด Errorได้
㉓ Unknown Column จาก Alias ผิด
ตัวอย่าง:
SELECT
p.identifier,
v.plate
FROM `players` p
JOIN `vehicles` v
ON x.owner = p.identifier;
ใน Query นี้ไม่มี Alias:
x
มีเพียง:
p
v
ดังนั้นปัญหาอาจไม่ใช่ Schemaขาด Column แต่เป็น Query Reference ผิด
ให้ดู SQLเต็มก่อน ALTER Database
㉔ JOIN Table ผิดก็เกิดได้
ตัวอย่าง Resourceต้องการ:
JOIN `characters` c
แต่ Codeจริงเขียน:
JOIN `players` c
จากนั้นใช้:
c.character_id
ซึ่งมีอยู่ใน characters แต่ไม่มีใน players
ผลก็ดูเหมือน:
Unknown column
แต่ Root Cause คือ Join ผิด Table
㉕ ตรวจ Query เต็มด้วย oxmysql Debug
Official oxmysql ระบุว่า:
set mysql_debug true
สามารถให้ Queries ถูกพิมพ์ใน Server Console และสามารถจำกัด Debug เฉพาะ Resources ที่กำหนดได้.
ตัวอย่าง:
set mysql_debug [
"my_resource"
]
เหมาะมากเมื่อคุณไม่แน่ใจว่า Resourceตัวไหนกำลัง Query Columnเก่า
㉖ oxmysql Debug UI ใช้ได้
Official Debug UI แสดง Queries ที่ Resources Execute, Query Response Times และ Statisticsแยกตาม Resource.
จึงช่วยหา:
Resource
↓
Query
↓
Unknown Column
ได้ง่ายขึ้น
สำหรับ Production Serverใหญ่ควรระวังการเปิด Debugตามคำแนะนำของ Official Documentation เพราะ Debug UI เหมาะกับ Development หรือ Player Countต่ำกว่า.
㉗ Query Parameters ไม่สามารถแทน Column Name แบบทั่วไปได้
oxmysql แยก Value Placeholders ออกจาก SQL Structure โดย Placeholders ถูกใช้สำหรับ Query Parameters และ MySQL.prepare ปัจจุบันรองรับ ? สำหรับ Value Placeholders.
ดังนั้นอย่าสมมติว่า:
SELECT ?
FROM `players`;
พร้อม Parameter:
identifier
จะทำหน้าที่เหมือน:
SELECT `identifier`
FROM `players`;
Column/Table Names เป็นส่วนของ SQL Structure ไม่ใช่ Data Value ธรรมดา
㉘ Dynamic Column ต้องใช้ Whitelist
ถ้า Resourceให้เลือก Sort Column เช่น:
name
created_at
level
อย่ารับชื่อ Columnจาก Client แล้วต่อ SQLโดยตรงโดยไม่มี Validation
ใช้ Mapping:
local columns = {
name = '`name`',
created = '`created_at`',
level = '`level`'
}
แล้วเลือกเฉพาะค่าที่กำหนดไว้
ช่วยทั้งลด Queryผิดและลดปัญหาด้าน SQL Injection
Official oxmysql ระบุว่า Placeholders ถูกออกแบบให้ส่ง Parametersแยกจาก Query เพื่อช่วยป้องกัน SQL Injectionในส่วนของ Values.
㉙ Unknown Column จาก SELECT * เกิดน้อยกว่า แต่ยังมีได้ใน Expression
Query:
SELECT *
FROM `players`;
เองไม่ระบุ Columnรายตัว
แต่ถ้ามี:
SELECT *,
`missing_column`
FROM `players`;
หรือ:
SELECT *
FROM `players`
ORDER BY `missing_column`;
ก็ยังเกิด 1054
ดังนั้นต้องดู Queryเต็ม ไม่ใช่ดูเฉพาะส่วน SELECTบรรทัดแรก
㉚ Unknown Column หลัง Restore Backup
สถานการณ์:
Resource ปัจจุบัน = v5
Backup Database = v2
Restoreแล้ว Serverเปิดได้
แต่ Resourceเริ่ม Query Columnsที่ v2ไม่เคยมี
ผล:
1054
กรณีนี้ควร:
Restore
↓
Run migrations ตามลำดับ
↓
Verify schema
↓
Start production resources
ไม่ควรแก้ Columnsทีละตัวจาก Console
㉛ Unknown Column หลังย้าย VPS
หาก Copy Databaseไม่ครบหรือ Import Schemaคนละไฟล์ อาจได้ Tablesเหมือนเดิมแต่ Columnsไม่ครบ
ตรวจ:
SHOW CREATE TABLE `players`;
บนเครื่องเก่าและเครื่องใหม่ แล้วเปรียบเทียบ Definitions.
ถ้า:
Old server
มี citizenid
แต่:
New server
ไม่มี citizenid
ก็พบ Root Cause
㉜ Table มี Column แต่ชื่อ Case ต่าง
Identifiersสามารถมี Case-related Behaviorตามประเภท Identifier และ Environment จึงควรใช้ชื่อ Columns/Identifiersอย่างสม่ำเสมอตาม Schemaจริง
วิธีที่ปลอดภัยคือ Copyชื่อจาก:
SHOW COLUMNS FROM `table`;
แทนพิมพ์จากความจำ
㉝ Reserved Word เกี่ยวไหม
หาก Columnใช้ชื่อที่ชน SQL Keyword หรือ Queryเขียน Identifierไม่ชัดเจน อาจเกิด SQL Parsing/Reference Problemsประเภทอื่นได้
แต่ถ้า Errorชัดว่า:
1054 Unknown column
ให้เริ่มจากตรวจ Column/Query Contextก่อน อย่าเพิ่งเปลี่ยน Database Configuration
㉞ วิธีหา Column ที่คล้ายชื่อเดิม
ถ้าไม่แน่ใจว่า Migrationเปลี่ยนชื่อจากอะไรเป็นอะไร ใช้:
SHOW COLUMNS FROM `players`;
หรือค้น:
SELECT
COLUMN_NAME
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'players';
MariaDB information_schema.COLUMNS ให้ Metadataของ Columnsใน Tableโดยตรง.
จากนั้นเทียบชื่อ เช่น:
identifier
player_identifier
citizenid
charid
กับ Resource Documentation/Migration
㉟ อย่า Copy Schema จาก Server อื่นแบบสุ่ม
Serverอื่นอาจใช้:
Framework คนละ Version
Custom Fork
Resource คนละ Release
Different Migrations
แม้ชื่อ Tableเหมือนกัน
การ Copy Column Definitionจาก Google/Discord/Serverอื่นมาใส่อาจทำให้ Errorแรกหาย แต่สร้าง:
Wrong Data Type
Wrong Default
Wrong Index
Wrong Constraints
ตามมา
ใช้ Schemaของ Resource Versionที่ติดตั้งจริง
㊱ ถ้าต้อง ADD COLUMN จริง
หาก Official Migrationยืนยันว่า Columnใหม่ต้องมี เช่น:
last_seen
ให้ใช้ SQLจาก Migrationนั้น
ไม่ควรแต่ง Definitionเอง
และก่อน Migration Productionควร:
Backup
ตรวจ Existing Rows
ทดสอบบนสำเนา
Run Migration
SHOW CREATE TABLE
Restart Resource
㊲ หลัง ADD COLUMN ตรวจอะไร
อย่าดูแค่ว่า Error 1054 หาย
ตรวจ:
Column Type
NULL / NOT NULL
DEFAULT
Index
Existing Data
Resource Read
Resource Write
ด้วย
เพราะ Columnชื่อถูกแต่ Definitionผิดยังสร้าง Errorชุดต่อไป เช่น:
1048 Cannot be null
1364 No default
1366 Incorrect value
1406 Data too long
㊳ Error 1054 หลัง Migration
ถ้ารัน Migrationแล้วแต่ Errorยังอยู่:
① Migration รัน Database ถูกตัวหรือไม่
② Migration Query ผ่านจริงหรือไม่
③ ALTER ถูก Rollback/Failed หรือไม่
④ Table Prefix ถูกหรือไม่
⑤ Resource Queryใช้ Tableเดียวกันหรือไม่
จากนั้นยืนยันด้วย:
SHOW COLUMNS FROM `table_name`;
อย่าเชื่อเพียงข้อความจาก Installerว่า Migration Complete
㊴ Migration ลง Database ผิดตัว
เหมือนกับ Error 1146 ได้เช่นกัน
ตัวอย่าง:
FiveM
→ database=fivem
แต่ Adminรัน:
ALTER TABLE players ADD citizenid ...
บน:
fivem_test
FiveMจึงยังเห็น Schemaเดิม
Official oxmysql Setup แสดงว่า Database Name เป็นส่วนหนึ่งของ mysql_connection_string.
㊵ Resource Start Order ไม่ได้สร้าง Column ให้เอง
การ Start oxmysqlก่อน Resourcesเป็น Setupที่ Official Documentationแนะนำ.
แต่:
start oxmysql
ไม่ได้หมายความว่า:
Missing Migration
จะถูกทำให้อัตโนมัติ
Resourceต้องมี Migration Mechanismเอง หรือ Adminต้องรัน Migrationตาม Instructions
㊶ Restart FXServer แก้ Error 1054 ไหม
ถ้า Columnไม่มีจริง:
Restart FXServer
Restart oxmysql
Restart MariaDB
ไม่ได้เพิ่ม Column
ต้องแก้:
Schema
หรือ
Query
ที่ต้นเหตุ
㊷ Unknown Column จาก Typo
ตัวอย่าง Schema:
identifier
Query:
SELECT `identifer`
FROM `players`;
ขาด:
i
เพียงตัวเดียว
ก็เกิด Unknown Column
ดังนั้นก่อน Migrationใหญ่ๆ ให้ Copyชื่อจาก:
SHOW COLUMNS
แล้วเทียบ Queryตัวอักษรต่อตัวอักษร
㊸ Unknown Column จาก Column ถูกลบ
Resourceเก่าอาจ Query:
steam
แต่ Migrationใหม่ลบ Columnนี้ออกแล้ว
ถ้า Resourceยังต้องใช้:
steam
แสดงว่า Resourceเองยังไม่รองรับ Schemaใหม่
ไม่ควร Add steam กลับทันทีโดยไม่ตรวจว่า Frameworkเปลี่ยน Identifier Modelไปแล้วหรือไม่
㊹ Unknown Column จาก SELECT Alias
ตัวอย่าง:
SELECT
`firstname` AS `name`
FROM `players`
WHERE `name` = ?;
SQL Alias Scopeมี Rulesของมันเอง จึงไม่ควรสรุปว่ามี Columnจริงชื่อ name
เมื่อ Errorเกี่ยวกับ Aliasให้ตรวจว่า Queryกำลังอ้าง:
Original Column
Table Alias
Result Alias
ในตำแหน่งที่ MariaDBอนุญาตหรือไม่
㊺ Error เกิดเฉพาะ Query เดียว
ถ้า Resource Queryอื่นอ่าน Tableเดียวกันได้หมด แต่มีเพียง Queryเดียวขึ้น 1054
โอกาสสูงขึ้นว่า:
Queryนั้นใช้ชื่อผิด
JOIN ผิด
Alias ผิด
Legacy Column
มากกว่า Database Migrationทั้งระบบเสีย
ใช้ mysql_debug เพื่อดู Queryนั้นแบบเต็ม.
㊻ Error เกิดหลาย Resources พร้อมกัน
ถ้าหลัง Restore แล้ว Resourcesจำนวนมากขึ้น:
Unknown column
ใน Tableหลักเดียวกัน
ให้สงสัย:
Database Schema เก่า
Restore คนละ Version
Migration ไม่ครบ
ก่อนแก้ Scriptแต่ละตัว
เพราะ Root Causeหนึ่งสามารถกระทบหลาย Resourcesพร้อมกัน
㊼ Error 1054 กับ Error 1060 ต่างกัน
MariaDB Error Reference แยก:
1054
Unknown column
และ:
1060
Duplicate column name
ออกจากกัน.
ดังนั้นหากพยายามแก้ 1054ด้วย:
ADD COLUMN
ทั้งที่ Columnมีอยู่แล้วใน Contextอื่นหรือ Migrationบางส่วนผ่านไปแล้ว คุณอาจเปลี่ยนไปเจอ Error 1060
นี่เป็นอีกเหตุผลที่ต้อง SHOW COLUMNS ก่อน ALTER
㊽ Error 1054 กับ Error 1052 ต่างกัน
MariaDB ระบุ:
1052
Column is ambiguous
ส่วน:
1054
Unknown column
ตัวอย่าง JOINสอง Tablesมี Column:
id
ทั้งคู่
แล้ว Queryใช้:
SELECT id
โดยไม่บอก Table อาจเกิด Ambiguous Column
แต่หากใช้:
missing_id
ที่ไม่มีเลย จะเป็น Unknown Column
㊾ Error 1054 กับ Error 1072
MariaDB Error Reference มี:
1072
Key column doesn't exist in table
ซึ่งมักเกิดตอนสร้าง Index/Constraintโดยอ้าง Columnที่ไม่มี.
จึงต่างจาก Runtime Query:
1054
แม้สาเหตุพื้นฐานจะเกี่ยวกับชื่อ Columnที่ไม่พบเหมือนกัน
㊿ วิธีแก้ Error 1054 แบบ 5 นาที
เมื่อ Console ขึ้น:
Unknown column 'citizenid'
in 'field list'
ทำตามนี้:
① จด Table
② จด Column
③ จด field list / where / on
④ เปิด mysql_debug หา Queryจริง
⑤ SHOW COLUMNS FROM table
⑥ SHOW CREATE TABLE table
⑦ เทียบ Resource Version
⑧ หา Migration
⑨ ตรวจว่า Queryใช้ Legacy Columnหรือไม่
⑩ Backupก่อน ALTER
⑪ รัน Migration/แก้ Query
⑫ ทดสอบใหม่
51. ตัวอย่าง Case 1 — Migration ไม่ครบ
Console:
Unknown column 'last_seen'
in 'field list'
Database:
SHOW COLUMNS FROM `players`;
ไม่มี:
last_seen
Resource Migrationของ Versionปัจจุบันระบุให้เพิ่ม Columnนี้
Root Cause:
Resource Updateแล้ว
Database Migrationยังไม่รัน
แก้ด้วย Migrationที่ถูก Version
52. ตัวอย่าง Case 2 — Query ใช้ชื่อเก่า
Database:
citizenid
Resource Query:
SELECT `identifier`
FROM `players`;
แต่ Framework Versionปัจจุบันเลิกใช้ identifier
กรณีนี้ Databaseอาจถูกต้อง
ต้อง Update Custom Resource
ไม่ควร Add identifierกลับเพียงเพื่อ Compatibilityจนกว่าจะประเมิน Data Model
53. ตัวอย่าง Case 3 — JOIN ผิด
Table:
players:
id
identifier
characters:
id
citizenid
แต่ Query:
SELECT *
FROM `players` p
JOIN `characters` c
ON p.citizenid = c.citizenid;
ปัญหา:
p.citizenid
ไม่มี
ต้องหา Keyจริงสำหรับ Relationship
ไม่ใช่เพิ่ม citizenidเข้า playersแบบเดา
54. ตัวอย่าง Case 4 — Database ผิดตัว
phpMyAdmin:
fivem_new.players
มี citizenid
FiveM:
mysql_connection_string
database=fivem_old
fivem_old.players ไม่มี citizenid
Result:
1054
ตรวจ Connection String และ Databaseที่ Migrationถูก Apply.
55. ตัวอย่าง Case 5 — Typo
Schema:
character_id
Query:
charater_id
เพียงสะกดผิดก็ไม่ต้อง Migrationใดๆ
แก้ Queryให้ตรง:
character_id
แล้วทดสอบใหม่
56. Checklist Error 1054 สำหรับ FiveM
ตรวจทั้งหมดนี้:
Error Code เป็น
1054หรือไม่SQLSTATE เป็น
42S22หรือไม่Column ชื่ออะไร
Error ระบุ
field list,where,onหรืออะไรResource ไหนยิง Query
Queryเต็มคืออะไร
Table ไหน
Table Alias อะไร
Column มีใน Tableจริงหรือไม่
SHOW COLUMNSตรวจแล้วหรือไม่SHOW CREATE TABLEตรวจแล้วหรือไม่information_schema พบ Columnหรือไม่
Column อยู่ Tableอื่นหรือไม่
Databaseถูกตัวหรือไม่
mysql_connection_string ใช้ Databaseไหน
Resource Versionอะไร
Schema Versionอะไร
Migrationครบหรือไม่
Migrationรัน Databaseถูกตัวหรือไม่
Columnถูก Renameหรือไม่
Columnถูก Dropหรือไม่
Custom Scriptใช้ Legacy Columnหรือไม่
Frameworkเพิ่งเปลี่ยนหรือไม่
JOINผิด Tableหรือไม่
Aliasผิดหรือไม่
Typoหรือไม่
Dynamic Columnผ่าน Whitelistหรือไม่
Restore Backupเก่าหรือไม่
Import SQLผิด Versionหรือไม่
Adminเคย ALTER Tableเองหรือไม่
Backupก่อน Migrationแล้วหรือไม่
หลัง Migrationตรวจ Definitionแล้วหรือไม่
Test Resource Queryแล้วหรือไม่
Monitor Errorอื่นต่อแล้วหรือไม่
ตาราง Error ที่ควรแยกให้ออก
| Error | ความหมาย |
|---|---|
1048 | Column รับ NULL ไม่ได้ |
1049 | Unknown Database |
1052 | Column Ambiguous |
1054 | Unknown Column |
1060 | Duplicate Column Name |
1062 | Duplicate Entry |
1072 | Key Column ไม่มีใน Table |
1146 | Table Doesn't Exist |
1364 | Field ไม่มี Default |
1366 | Incorrect Value |
MariaDB Error Reference แยก Error Codesเหล่านี้ตาม Contextอย่างชัดเจน.
FiveM Unknown Column แก้อย่างไร
เริ่มจาก:
SHOW COLUMNS FROM `table_name`;
ถ้า Columnไม่มี ให้ตรวจ Resource Migration
ถ้า Columnมี ให้ตรวจ:
Database
Table
Alias
Query
ต่อ
MariaDB ระบุว่า SHOW COLUMNS และ information_schema.COLUMNS ใช้ตรวจ Metadataของ Columnsได้โดยตรง.
FiveM Error 1054 คืออะไร
คือ MariaDB:
ER_BAD_FIELD_ERROR
SQLSTATE:
42S22
พร้อมข้อความ:
Unknown column '...' in '...'
FiveM Unknown Column in Field List แก้อย่างไร
ตรวจชื่อที่อยู่ใน:
SELECT
INSERT
UPDATE
Expression
แล้วใช้:
SHOW COLUMNS FROM `table_name`;
เปรียบเทียบชื่อ Columnจริง
ถ้าไม่มีให้ตรวจ Migration ก่อน ADD COLUMN
FiveM Unknown Column in Where Clause แก้อย่างไร
ตรวจ Columnหลัง:
WHERE
ว่ามีใน Table/Aliasที่ Queryกำลังอ้างหรือไม่
ตัวอย่าง:
WHERE p.citizenid = ?
ต้องยืนยันว่า Alias p ชี้ Tableที่มี citizenid จริง
FiveM Unknown Column in On Clause แก้อย่างไร
ตรวจ JOINทั้งสองฝั่ง
ON a.owner = b.identifier
ต้องยืนยันว่า:
a.owner
และ:
b.identifier
มีจริงใน Tablesตาม Alias
อย่าเพิ่ม Columnก่อนตรวจ JOIN Structure
FiveM Unknown Column หลัง Update Script แก้อย่างไร
ตรวจ:
Resource Version
Migration Version
Current Schema
หาก Resourceใหม่อ้าง Columnที่ Schemaเก่าไม่มี ให้ใช้ Migrationของ Versionนั้น ไม่ใช่สร้าง Column Definitionเอง
FiveM Unknown Column หลัง Restore Database แก้อย่างไร
Backupอาจเก่ากว่า Resource
ตรวจ:
SHOW CREATE TABLE `table_name`;
แล้ว Apply Migrationsตามลำดับจน Schemaตรง Resource Version.
FiveM Unknown Column ทั้งที่ Column มีอยู่
ตรวจว่า FiveMใช้ Databaseเดียวกับที่คุณกำลังดูหรือไม่
oxmysql Connection String กำหนด Database และต้องถูกตั้งค่าก่อน Resourcesที่ใช้งาน Database.
จากนั้นตรวจ:
Table Alias
Table Name
Query Context
ต่อ
FiveM mysql_debug ใช้หา Unknown Column ได้ไหม
ได้
set mysql_debug true
Official oxmysql ระบุว่าเมื่อเปิด Debug Queriesจะถูกพิมพ์ใน Server Console และสามารถเลือกเฉพาะ Resourcesที่ต้องการได้.
เหมาะสำหรับหา Queryตัวเต็มที่สร้าง Error 1054
FiveM Debug UI ช่วยอะไร
Debug UIของ oxmysql แสดง Queriesที่แต่ละ Resource Execute รวมถึง Execution Time และ Statisticsต่อ Resource.
ช่วยตาม:
Error
→ Resource
→ Query
→ Column
ได้เร็วขึ้น
FiveM ADD COLUMN เพื่อแก้ 1054 ได้ไหม
ได้เฉพาะเมื่อ Migration/Official Schemaยืนยันว่า Columnนั้นต้องมีจริง
ห้ามดูเพียง:
Unknown column 'abc'
แล้วสร้าง:
ALTER TABLE ...
ADD abc VARCHAR(255);
จากการเดา เพราะ Data Type, Default, Index และ Constraintsอาจผิดทั้งหมด
FiveM Restart oxmysql แก้ 1054 ได้ไหม
ถ้า Schemaขาด Columnจริง:
ไม่
Restart Database Layerไม่ได้เพิ่ม Column
ต้องแก้ Queryหรือ Migration
FAQ FiveM MariaDB Unknown Column
Error 1054 คืออะไร?
คือ MariaDB ER_BAD_FIELD_ERROR เมื่อหา Columnที่ Queryอ้างถึงไม่พบใน Contextนั้น.
Error 1054 กับ 1146 ต่างกันอย่างไร?
1054 คือ Unknown Column ส่วน 1146 คือ Table Doesn't Exist.
ดูว่า Table มี Columnอะไรบ้างอย่างไร?
ใช้:
SHOW COLUMNS FROM `table_name`;
หรือ:
DESCRIBE `table_name`;
ดู Schemaเต็มได้อย่างไร?
ใช้:
SHOW CREATE TABLE `table_name`;
Unknown Column หลัง Update Script เกิดจาก Migration ไม่ครบได้ไหม?
ได้ เป็นหนึ่งในกรณีที่ควรตรวจทันทีเมื่อ Resourceใหม่เริ่มอ้าง Columnที่ Current Schemaไม่มี
Unknown Column หลังเปลี่ยน Framework เกิดได้ไหม?
ได้ เพราะ Frameworkแต่ละแบบอาจใช้ชื่อ Columnsและ Data Modelไม่เหมือนกัน Custom Scriptsจึงต้องถูกปรับให้ตรง Frameworkปัจจุบัน
Column มีอยู่แต่ยัง Error เพราะอะไร?
ตรวจ Databaseที่ FiveMเชื่อม, Table, Alias และ Query Context โดยเฉพาะ Connection Stringของ oxmysql.
ใช้ mysql_debug ดู Queryได้ไหม?
ได้ Official oxmysqlรองรับ mysql_debug เพื่อ Print Queriesใน Server Console.
ควร ADD COLUMN เองไหม?
ควรทำเมื่อ Official Migrationหรือ Schemaของ Resource Versionนั้นระบุชัด ไม่ควรสร้างจากชื่อ Errorเพียงอย่างเดียว
Unknown Column in ON Clause คืออะไร?
มักเกี่ยวกับ Columnหรือ Aliasใน JOIN Condition ที่ MariaDBไม่สามารถ Resolveได้ ต้องตรวจ Columnsทั้งสองฝั่งของ JOIN
Unknown Column in WHERE Clause คืออะไร?
หมายถึงชื่อที่ Queryใช้ใน WHEREไม่สามารถ Resolveเป็น Columnใน Contextนั้น ต้องตรวจชื่อ Table/Aliasและ Schema
Restart MariaDB ช่วยไหม?
ไม่ หาก Columnไม่มีหรือ Queryใช้ชื่อผิด ต้องแก้ Schemaหรือ SQL
ประเด็นสำคัญ
เมื่อ FiveM ขึ้น:
ERROR 1054
Unknown column
ให้ใช้สูตร:
1054
↓
ดูชื่อ Column
↓
ดู Context: field list / where / on
↓
ดู Queryจริง
↓
SHOW COLUMNS
↓
SHOW CREATE TABLE
↓
ดู Databaseที่ FiveMใช้
↓
เทียบ Resource Version
↓
ตรวจ Migration
↓
ตัดสินว่า Queryผิดหรือ Schemaเก่า
MariaDB ระบุ Error 1054 เป็น ER_BAD_FIELD_ERROR และมีเครื่องมือโดยตรงอย่าง SHOW COLUMNS, DESCRIBE, SHOW CREATE TABLE และ information_schema.COLUMNS สำหรับตรวจ Column Definitions และ Metadata.
สำหรับ FiveM อย่าแก้ Unknown column ด้วยการ ADD COLUMN แบบลองผิดลองถูก เพราะปัญหาอาจเกิดจาก Resource เก่า, JOIN ผิด, Alias ผิด, Framework คนละแบบ หรือ Migration รันผิด Database ไม่ใช่ Schemaขาด Columnเสมอไป
สำหรับผู้อ่าน comsiam ให้จำสูตร “1054 = ดู Query ก่อน แล้วค่อยเทียบ Schema” และ comsiam แนะนำให้ใช้ mysql_debug จับ Queryจริงจาก Resource แล้วเทียบกับ SHOW CREATE TABLE เพราะสองอย่างนี้จะช่วยแยกได้เร็วที่สุดว่า ต้องแก้ Script หรือ Database Migration
Comments
Post a Comment