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

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

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

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

  3. Column ชื่ออะไร

  4. Error ระบุ field list, where, on หรืออะไร

  5. Resource ไหนยิง Query

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

  7. Table ไหน

  8. Table Alias อะไร

  9. Column มีใน Tableจริงหรือไม่

  10. SHOW COLUMNS ตรวจแล้วหรือไม่

  11. SHOW CREATE TABLE ตรวจแล้วหรือไม่

  12. information_schema พบ Columnหรือไม่

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

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

  15. mysql_connection_string ใช้ Databaseไหน

  16. Resource Versionอะไร

  17. Schema Versionอะไร

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

  19. Migrationรัน Databaseถูกตัวหรือไม่

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

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

  22. Custom Scriptใช้ Legacy Columnหรือไม่

  23. Frameworkเพิ่งเปลี่ยนหรือไม่

  24. JOINผิด Tableหรือไม่

  25. Aliasผิดหรือไม่

  26. Typoหรือไม่

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

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

  29. Import SQLผิด Versionหรือไม่

  30. Adminเคย ALTER Tableเองหรือไม่

  31. Backupก่อน Migrationแล้วหรือไม่

  32. หลัง Migrationตรวจ Definitionแล้วหรือไม่

  33. Test Resource Queryแล้วหรือไม่

  34. Monitor Errorอื่นต่อแล้วหรือไม่

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

Errorความหมาย
1048Column รับ NULL ไม่ได้
1049Unknown Database
1052Column Ambiguous
1054Unknown Column
1060Duplicate Column Name
1062Duplicate Entry
1072Key Column ไม่มีใน Table
1146Table Doesn't Exist
1364Field ไม่มี Default
1366Incorrect 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

Popular posts from this blog

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

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

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