FiveM MySQL Column Count Doesn't Match Value Count Error 1136 แก้อย่างไร? ตรวจ INSERT, Columns, VALUES และ Database Schema ให้ตรงกัน
ปัญหา FiveM MySQL/MariaDB ขึ้น Column count doesn't match value count at row 1 มักเกิดตอน Resource พยายาม INSERT ข้อมูลลง Database แต่จำนวน Column ที่ต้องการบันทึก ไม่เท่ากับจำนวน Value ที่ถูกส่งเข้าไป
ตัวอย่าง Error:
ERROR 1136 (21S01): Column count doesn't match value count at row 1
หรือ:
ER_WRONG_VALUE_COUNT_ON_ROW
MariaDB ระบุ Error 1136, SQLSTATE 21S01 เป็น ER_WRONG_VALUE_COUNT_ON_ROW และข้อความหลักคือ Column count doesn't match value count at row
ใน FiveM ปัญหานี้มักเจอหลัง:
Update Resource
Import SQL
เปลี่ยน Framework
เพิ่ม Column ใหม่
แก้
INSERTQuery เองMigration Database ไม่ครบ
Resource Version ไม่ตรง Schema
เพิ่ม Parameter แต่ไม่ได้เพิ่ม Column
เพิ่ม Column แต่ไม่ได้เพิ่ม Parameter
Bulk INSERT สร้าง Values ไม่เท่ากัน
หลักการแก้คือ:
อ่านข้อความ Error → หา Resource → หา INSERT Query → นับ Columns → นับ Values → ตรวจ Schema → ตรวจ Parameters → แก้ให้ตรงกัน
① Error 1136 คืออะไร
หมายถึงจำนวนข้อมูลที่ Query กำลัง Insert ไม่ตรงกับจำนวน Column ที่ Statement คาดหวัง
MariaDB ระบุ Error นี้เป็น:
1136
21S01
ER_WRONG_VALUE_COUNT_ON_ROW
② ตัวอย่างง่ายที่สุด
Query:
INSERT INTO players
(firstname, lastname, job)
VALUES ('John', 'Smith');
มี:
3 Columns
2 Values
จึงไม่ตรงกัน
③ รูปแบบที่ถูก
INSERT INTO players
(firstname, lastname, job)
VALUES ('John', 'Smith', 'unemployed');
ตอนใช้ INSERT ... VALUES รายการ Values ต้องสัมพันธ์กับรายการ Columns ที่ระบุ และ Values จะถูกจับคู่ตามลำดับของ Column List
④ ปัญหากลับด้านก็เกิดได้
เช่น:
INSERT INTO players
(firstname, lastname)
VALUES ('John', 'Smith', 'unemployed');
มี:
2 Columns
3 Values
ก็ไม่ตรงกัน
⑤ FiveM Error นี้เป็น Connection Error ไหม
ไม่
ถ้า MariaDB ตอบ Error 1136 ได้ แสดงว่า Query เดินทางไปถึง Database แล้ว
ดังนั้นอย่าเริ่มแก้ด้วย:
Database Password
Port
Firewall
โดยไม่มี Error อื่นสนับสนุน
⑥ Error 1136 เป็น Syntax Error 1064 ไหม
ไม่เหมือนกัน
1064
SQL Syntax ไม่ถูกต้อง
1136
โครงสร้าง INSERT อ่านได้ แต่จำนวน Columns/Values ไม่ตรงกัน
⑦ Error 1136 กับ Unknown Column ต่างกัน
Unknown Column
Resource เรียก Column ที่ Database ไม่มี
1136
จำนวน Values ไม่สัมพันธ์กับ Column List
⑧ จุดที่ควรตรวจอันดับแรก
หา Query ที่ขึ้นต้นด้วย:
INSERT INTO
หรือ:
INSERT
ใน Resource ที่ Console แจ้ง Error
⑨ ตัวอย่าง FiveM Character Creation
สมมติ Resource มี:
INSERT INTO players
(citizenid, firstname, lastname, job)
VALUES (?, ?, ?);
เห็นได้ทันทีว่า:
4 Columns
3 Placeholders
ผิด
⑩ ต้องแก้เป็นอะไร
ถ้าต้องบันทึกทั้ง 4 Field:
INSERT INTO players
(citizenid, firstname, lastname, job)
VALUES (?, ?, ?, ?);
และ Code ต้องส่ง Parameters 4 ค่าเช่นกัน
⑪ Placeholder คืออะไร
เช่น:
?
ใช้แทน Value ที่ Database Driver จะได้รับจาก Parameters
⑫ จำนวน ? ต้องสัมพันธ์กับ Parameters
ไม่ใช่แค่ Column Count
คุณต้องตรวจทั้ง:
Columns → Placeholders → Parameters
⑬ ตัวอย่าง
Query:
INSERT INTO players
(firstname, lastname)
VALUES (?, ?);
แต่ Code ส่ง:
John
Smith
Police
แม้ SQL String ดูถูก แต่ Database Wrapper/API อาจมี Error จาก Parameter Mapping ตาม Library ที่ใช้
⑭ ควรดู Query ที่ถูกส่งจริง
ไม่ใช่ดู Source Template อย่างเดียว
⑮ Dynamic Query ทำให้ Error 1136 ได้
เช่น Code เพิ่ม Column ตาม Config
แต่ลืมเพิ่ม Value
⑯ ตัวอย่างแนวคิด
ถ้า Config เปิด:
UsePhone = true
Code เพิ่ม:
phone_number
เข้า Column List
แต่ Values ยังเท่าเดิม
จะเกิด Count Mismatch ได้
⑰ Error หลังเปิด Feature ใหม่
จึงควรตรวจ Dynamic INSERT
ก่อนแก้ Database
⑱ Error หลัง Update Resource
เป็น Case สำคัญมาก
Resource Version ใหม่อาจเปลี่ยน:
Column List
Save Format
Migration
แต่ Database หรือ Custom Code ยังเป็น Version เก่า
⑲ Schema Version ไม่ตรง Code
อาจทำให้ Developer เลือกใช้:
INSERT INTO table VALUES (...)
แล้วจำนวน Values ไม่ตรงกับจำนวน Columns ปัจจุบัน
⑳ INSERT โดยไม่ระบุ Column Names เสี่ยงกว่า
ตัวอย่าง:
INSERT INTO players
VALUES (...);
เมื่อไม่ระบุ Column List จำนวน Values ต้องสัมพันธ์กับโครงสร้าง Table ที่ Statement คาดหวัง
MariaDB แนะนำในเอกสารด้าน Database Applications ว่า ควรระบุชื่อ Columns ใน INSERT เพื่อหลีกเลี่ยงปัญหาเมื่อ Schema เปลี่ยน เช่นมีการเพิ่มหรือเปลี่ยนลำดับ Column
㉑ ตัวอย่างปัญหา
เดิม Table มี:
id
firstname
lastname
Resource ใช้:
INSERT INTO players
VALUES (1, 'John', 'Smith');
ทำงาน
㉒ ต่อมา Migration เพิ่ม
job
Table กลายเป็น:
id
firstname
lastname
job
แต่ Resource เก่ายังส่ง 3 Values
จึงอาจเกิด Count Mismatch
㉓ วิธีที่แข็งแรงกว่า
ระบุ Column ที่ต้องใช้:
INSERT INTO players
(firstname, lastname)
VALUES ('John', 'Smith');
ถ้า Columns อื่นมี Default/NULL ที่รองรับ Query ก็ไม่ต้องผูกกับทุก Column ของ Table
MariaDB documentation ระบุว่าการกำหนด Column List ช่วยให้สามารถใส่ Values ตาม Columns ที่เลือก และละ Columns ที่มี Default หรือรองรับ NULL ได้
㉔ อย่าแก้ด้วยการลบ Column ใหม่
ถ้า Column นั้นเป็นส่วนหนึ่งของ Migration ที่ถูกต้อง
Resource อื่นอาจต้องใช้
㉕ อย่าเพิ่มค่าปลอมให้ครบจำนวนแบบสุ่ม
เช่นเห็นขาด 1 ค่าแล้วเพิ่ม:
''
เข้าไป
โดยไม่รู้ว่า Column นั้นหมายถึงอะไร
㉖ เพราะ Data อาจผิดเงียบ ๆ
เช่น Column ที่ขาดคือ:
citizenid
แต่คุณใส่ Empty String
Character Mappingอาจพัง
㉗ ต้องรู้ Column ที่ขาดจริง
ใช้:
DESCRIBE players;
หรือ:
SHOW CREATE TABLE players;
เพื่อตรวจโครงสร้างจริง
㉘ แต่ถ้า Query มี Column List อยู่แล้ว
ให้นับ Column Listก่อน ไม่จำเป็นต้องนับทุก Columnใน Table
㉙ ตัวอย่าง
INSERT INTO players
(firstname, lastname)
VALUES (?, ?);
แม้ Tableมี 20 Columns ก็สามารถถูกต้องได้ถ้า Columnsอื่นมี Default/รองรับการละค่าอย่างเหมาะสม
㉚ AUTO_INCREMENT Column ต้องใส่เองไหม
ไม่จำเป็นเสมอไป
หาก ID ถูกออกแบบเป็น AUTO_INCREMENT Databaseสามารถสร้างค่าต่อไปให้อัตโนมัติเมื่อ Insert โดยไม่กำหนด Columnนั้นตามรูปแบบที่เหมาะสม
㉛ ตัวอย่าง
Table:
id AUTO_INCREMENT
firstname
lastname
Query สามารถเป็น:
INSERT INTO players
(firstname, lastname)
VALUES (?, ?);
โดยไม่ส่ง IDเอง
㉜ อย่าเพิ่ม NULL เพียงเพื่อให้ครบแบบไม่เข้าใจ
แม้บาง AUTO_INCREMENT design อาจ Handle NULL ได้ แต่การระบุ Column Listให้ชัดเจนมักอ่านและดูแลง่ายกว่า
㉝ Default Value คืออะไร
ค่าที่ Database ใช้เมื่อ Insert ไม่ได้ระบุ Columnนั้น และ Schema กำหนด Defaultไว้
㉞ Columns ที่ไม่มี Default อาจเกิด Error อื่น
หลังแก้ 1136 แล้วอาจเจอ:
Field doesn't have a default value
ถ้า Queryละ Required Column
㉟ ดังนั้นอย่ามุ่งแค่ทำ Countให้เท่ากัน
ต้องให้ข้อมูลครบตาม Business Logicด้วย
㊱ FiveM Resource ที่ใช้ INSERT INTO table VALUES
ควรตรวจเป็นพิเศษหลัง:
Framework Update
Database Migration
㊲ เพราะ Schemaเปลี่ยนได้
และ Queryประเภทนี้ผูกกับ Column Orderของ Tableมากกว่า Queryที่ระบุชื่อ Columnsชัดเจน
㊳ MariaDB แนะนำให้ระบุ Column Names
เพื่อลดปัญหาเมื่อ Table Schemaเปลี่ยน
㊴ Error หลังเพิ่ม Column ด้วย phpMyAdmin
ถ้า Resourceเก่าใช้:
INSERT INTO table VALUES(...)
การเพิ่ม Columnเองสามารถทำ Queryเดิม Countไม่ตรงได้
㊵ นี่คือเหตุผลที่ไม่ควรแก้ Schemaสุ่ม
Custom Columnหนึ่งตัวอาจกระทบ Resourceเก่า
㊶ Error หลังติดตั้ง Script ใหม่
อาจ Scriptใช้ Schemaที่คาดไว้คนละแบบ
㊷ ตัวอย่าง
Script Documentationคาด:
players table v3
Serverจริง:
players table v1
Query/Columnsอาจไม่ตรง
㊸ ต้องตรวจ Framework Compatibility
เช่น Resource Versionหนึ่งอาจออกแบบสำหรับ Framework Schemaหนึ่งโดยเฉพาะ
㊹ ESX กับ QBCore ใช้ Schema เดียวกันหรือไม่
ไม่ควรถือว่าเหมือนกัน
ต้องใช้ Resource Adapter/Configที่ตรง Frameworkจริง
㊺ Errorหลังเลือก Frameworkผิดใน Config
Resourceอาจสร้าง:
Column List แบบหนึ่ง
Parameter Data แบบอีกแบบ
ได้
㊻ ตรวจ Framework Configurationก่อน ALTER Table
สำคัญมาก
㊼ Errorจาก Custom Bridge
Bridgeที่แปลง Dataระหว่าง Frameworkอาจลืมเพิ่ม Parameterใหม่
㊽ Resource Developerควร Testทุก Adapter
เช่น:
ESX
QBCore
Custom
แยกกัน
㊾ Character Creation เป็นจุดที่เจอ Error นี้บ่อย
เพราะ Insert Characterใหม่มี Fieldsจำนวนมาก เช่น:
Identifier
Name
DOB
Job
Position
Metadata
㊿ เพิ่ม Fieldหนึ่งตัวแล้วลืมแก้ VALUES
เกิดได้ง่าย
51. Example
เดิม:
INSERT INTO characters
(firstname, lastname, dob)
VALUES (?, ?, ?);
เพิ่ม:
phone
เป็น:
INSERT INTO characters
(firstname, lastname, dob, phone)
VALUES (?, ?, ?);
ผิดทันที
52. ต้องเป็น
INSERT INTO characters
(firstname, lastname, dob, phone)
VALUES (?, ?, ?, ?);
53. และ Parameters ต้องมี Phoneด้วย
SQL Stringถูกอย่างเดียวยังไม่พอ
54. Parameter Mapping สำคัญ
ตรวจว่า:
firstname → ?
lastname → ?
dob → ?
phone → ?
ตามลำดับ
55. จำนวนเท่ากันแต่ลำดับผิดจะเกิด 1136ไหม
ไม่จำเป็น
Queryอาจผ่านแต่ข้อมูลลงผิด Column
ซึ่งอันตรายกว่า Errorเสียอีก
56. ตัวอย่าง
Columns:
firstname
lastname
phone
Values:
John
5551234
Smith
Countเท่ากัน
แต่:
lastname = phone
phone = lastname
ข้อมูลผิด
57. จึงต้องเช็กทั้ง Count และ Order
MariaDB ระบุว่า Values ต้องเรียงตามลำดับ Column Listที่กำหนด
58. Bulk INSERT คืออะไร
Insertหลาย Rowsใน Statementเดียว
ตัวอย่าง:
INSERT INTO jobs
(name, label)
VALUES
('police', 'Police'),
('ambulance', 'EMS');
MariaDBรองรับการใส่หลาย Value Listsเพื่อ Insertหลาย Rowsใน Statementเดียว
59. แต่ทุก Row ต้องมีจำนวน Valuesสัมพันธ์กัน
ผิด:
INSERT INTO jobs
(name, label)
VALUES
('police', 'Police'),
('ambulance');
Rowที่สองมี Valueน้อยกว่า
60. Errorอาจบอก at row 2
จึงต้องอ่านหมายเลข Rowใน Error
61. row 2 ไม่ใช่ Database ID 2
หมายถึง Value Rowลำดับที่สองใน Statementนั้น
62. ตัวอย่าง Error
Column count doesn't match value count at row 3
ให้ตรวจ Value Groupลำดับ 3
63. Bulk Insert Generator พลาดง่าย
โดยเฉพาะ Dynamic Arrays
64. Example
บาง Item มี:
name
label
weight
บาง Item มีแค่:
name
label
ถ้า Generatorสร้าง Rowsไม่ครบ 3 Valuesทุกตัว:
Error 1136
65. Normalize Data ก่อน Bulk Insert
ทุก Objectควรมี Fieldsที่ Resourceต้องการครบ
66. Missing Optional Field
อาจใช้:
NULLDefault
ตาม Schemaและ Business Logic
67. แต่ต้องถูกต้องตาม Column Definition
อย่าเติม NULL ทุกกรณี
68. Bulk Item Import
พบได้ตอนติดตั้ง:
Inventory Items
Jobs
Vehicles
69. SQL Seed Dataสามารถมี Error1136
ถ้า Rowหนึ่งขาด Valueเพียงตัวเดียว
70. SQL Fileยาวมากต้องดู Rowที่ Error
ไม่ต้องอ่านทุก Rowตั้งแต่ต้น
71. แต่ตรวจ Rowก่อนหน้าด้วย
Comma/Parenthesisผิดก่อนหน้าอาจทำ Parserแบ่ง Rowsผิด
72. Error 1136 กับ 1064สามารถเกี่ยวกันได้
ถ้า SQL Structureเสียหนักอาจได้ Syntax Errorแทน
73. อย่ายึด Error Numberอย่างเดียว
อ่านข้อความเต็มสำคัญกว่า
74. INSERT SELECT คืออะไร
MariaDBรองรับการ Insertผลลัพธ์ของ SELECT เข้า Table ด้วยรูปแบบ INSERT ... SELECT
75. INSERT SELECT ก็ต้อง Column Countตรง
ตัวอย่าง:
INSERT INTO archive
(id, name)
SELECT id, name, job
FROM players;
Targetมี 2 Columns
SELECTคืน 3 Columns
ย่อมไม่ตรงกับสิ่งที่ Statementต้องการ
76. วิธีแก้
ถ้าต้องการแค่สองค่า:
INSERT INTO archive
(id, name)
SELECT id, name
FROM players;
77. Migration Scripts มักใช้ INSERT SELECT
เพื่อ:
ย้ายข้อมูล
Archive
Transform Schema
78. Error 1136หลัง Migration
ให้ตรวจ SELECT Output Countด้วย
ไม่ใช่แค่ VALUES
79. SELECT * เสี่ยงใน Migration
เพราะถ้า Source Tableเพิ่ม Column:
SELECT *
อาจคืนจำนวน Columnsมากขึ้น
80. MariaDBแนะนำให้ระบุ Columnsแทน SELECT * ใน Application Design
เพื่อลดปัญหาจาก Schema Changes
81. ตัวอย่างที่แข็งแรงกว่า
แทน:
INSERT INTO backup_players
SELECT *
FROM players;
ใช้:
INSERT INTO backup_players
(id, firstname, lastname)
SELECT id, firstname, lastname
FROM players;
82. แต่ Typesก็ต้องสัมพันธ์กันด้วย
Countตรงไม่ได้หมายความว่า Data Typeถูกเสมอ
83. หลังแก้ Countอาจเจอ Type Error
เช่น:
Incorrect datetime
Data too long
ต้องแก้ตาม Errorถัดไป
84. Error1136อาจซ่อน Errorอื่น
เพราะ Databaseหยุดตั้งแต่ Countไม่ตรง
85. แก้ทีละ Layer
Column Count
Types
Constraints
Business Logic
86. Generated Column คืออะไร
MariaDBมี Generated Columnsที่ค่าถูกคำนวณจาก Expression และ Generated Columnบางประเภทไม่สามารถถูกกำหนดค่าแบบเดียวกับ Columnทั่วไปได้
87. Schemaมี Generated Columnแล้ว Queryเก่าอาจมีปัญหา
โดยเฉพาะ Queryที่ไม่ระบุ Column Names
88. นี่เป็นอีกเหตุผลที่ควรใช้ Column List
เพื่อเลือกเฉพาะ Fieldsที่ต้อง Insertจริง
89. Trigger เกี่ยวได้ไหม
Errorอาจเกิดจาก SQLใน Triggerที่ทำ INSERTต่ออีก Tableหนึ่ง
90. FiveM Resource Queryดูถูกแต่ Errorยังเกิด
ให้ตรวจ:
Triggers
Procedures
ถ้า Database Schemaมี Custom Logic
91. แต่ Server FiveMทั่วไปควรตรวจ Resource Queryก่อน
เพราะ Triggerไม่ใช่ทุก Serverมี
92. Error Messageอาจบอก Tableของ Trigger
ช่วยแยก
93. SQL Dumpจาก Serverเก่า
อาจมี:
INSERT INTO table VALUES (...)
แต่ Restoreเข้า Schemaใหม่ที่มี Columnsเพิ่ม
จึง Error
94. Source SchemaกับDestination Schemaต้องตรงกัน
ก่อน Import Data
95. Restoreควร Restoreทั้ง SchemaและDataอย่างมีแผน
ไม่ควร Importเฉพาะ Data Dumpลง Schemaคนละ Version
96. Errorหลัง Copy Rowsด้วย phpMyAdmin
อาจ Target Tableมี Columnsไม่เท่า Source
97. Database Mergeก็เป็น Caseสำคัญ
Server A:
players 20 columns
Server B:
players 23 columns
Copy SELECT * ตรง ๆ ไม่ปลอดภัย
98. ต้อง Map Columnsชัดเจน
เช่น:
A.firstname → B.firstname
A.lastname → B.lastname
99. Migrationไม่ควรพึ่ง Positionอย่างเดียว
เพราะ Columnsอาจเรียงต่างกัน
100. Explicit Mappingปลอดภัยกว่า
โดยเฉพาะ Databaseที่ Customมาหลายปี
101. Errorหลัง Add Custom Column
สมมติคุณเพิ่ม:
vip_level
ลง players
Resourceเก่าใช้:
INSERT INTO players VALUES (...)
อาจ Errorทันที
102. วิธีแก้ที่ดีกว่า
แก้ Resource Queryให้ระบุ Column Names
หรือใช้ Migration/Resource Versionที่รองรับ Custom Schemaจริง
103. ไม่ควรลบ vip_levelถ้า Featureต้องใช้
เพียงเพราะ Queryเก่าไม่ได้เขียนดี
104. แต่ถ้า Columnเพิ่มโดยไม่จำเป็น
Rollback Custom Changeอาจเป็นทางเลือกหลัง Backup
105. ต้องรู้ Source of Truth
Resource Code
Official SQL
Production Schema
106. Errorหลัง Add Job Column
Custom Job Scriptอาจเพิ่ม:
job2
แล้ว Core Resourceเก่ายิง INSERT VALUES
เกิด Count Mismatch
107. Multi-job Scriptsต้องระวัง
มักแก้ Core Tables
108. Multi-character Scriptsก็เช่นกัน
อาจเพิ่ม:
charid
slot
metadata
109. Phone Scriptsอาจเพิ่ม Phone Column
ต้องตรวจ Core Character Insertด้วย
110. Housing Scriptsบางตัวไม่ควรต้องแก้ Players Table
ขึ้นอยู่กับ Architecture
อย่า Copy SQLจาก Scriptอื่น
111. Framework Modificationสะสมทำให้ Errorง่าย
เพราะ Schemaเริ่มต่างจาก Default
112. Schema Debt คืออะไร
การแก้ Databaseซ้ำ ๆ จน:
ไม่มี Documentation
Resource Versionsไม่ชัด
Columns Customจำนวนมาก
113. Error1136เป็นสัญญาณหนึ่งของ Schema Debt
โดยเฉพาะ INSERT VALUESเก่า
114. วิธีลดปัญหา
ระบุ Column Names
ใช้ Migrations
Version Control Schema
Document Custom Columns
115. Custom Developerควรหลีกเลี่ยง INSERT INTO table VALUES(...)
เมื่อ Tableมีโอกาสเปลี่ยน
MariaDB guidanceเองแนะนำให้ระบุ Column Namesใน INSERTเพื่อป้องกันผลจากการเปลี่ยน Schema
116. Error1136จาก Seed Jobs
ตัวอย่าง:
INSERT INTO jobs
(name, label, whitelisted)
VALUES
('police', 'Police');
ขาดค่า:
whitelisted
117. ควรใช้ Defaultได้ไหม
ถ้า Columnมี Defaultและคุณไม่ต้องการกำหนดค่า:
อย่าระบุ Columnนั้นใน Column List
เช่น:
INSERT INTO jobs
(name, label)
VALUES
('police', 'Police');
118. ดีกว่าใส่ค่าเดา
เพราะ Databaseจะใช้ Defaultที่ Schemaกำหนด
119. DEFAULT Keyword ใช้ได้ไหม
SQLมีวิธีใช้ Defaultในบางบริบท แต่สำหรับ FiveM Resourceทั่วไป การระบุ Columnsอย่างชัดเจนมักอ่านง่ายกว่า
120. NULL กับ Missing Valueต่างกัน
Missing Columnจาก INSERT
Databaseใช้ Default/NULLตาม Schema
Explicit NULL
กำหนดค่าเป็น NULLโดยตรง
ไม่เหมือนกันเสมอไป
121. อย่าใช้ Empty Stringแทน Missingทุกครั้ง
'' คือ Stringว่าง
ไม่ใช่:
NULL
Default
122. FiveM JSON Fields
ถ้าขาด Valueของ:
metadata
อย่าใส่:
''
ถ้า Resourceคาด JSON
123. อาจต้องเป็น
{}
หรือ NULL หรือ Default
ขึ้นอยู่กับ Resource
124. Inventory Fieldsก็เช่นกัน
ต้องใช้รูปแบบที่ Resourceออกแบบไว้จริง
125. Errorจาก SQL Migrationที่เพิ่ม Columnsหลายตัว
ถ้า Migrationเปลี่ยน Tableแต่ Code Updateไม่ครบ:
Error1136เกิดได้
126. CodeกับMigrationต้อง Deployเป็นชุดเดียวกัน
สำคัญสำหรับ Production
127. Update Codeก่อน Migration
อาจทำให้ Codeใหม่คาด Schemaใหม่แต่ Databaseยังเก่า
128. Migrationก่อน Codeก็อาจมีปัญหา
ถ้า Codeเก่าใช้ INSERT VALUESที่ผูกกับ Column Countเดิม
129. จึงต้องดู Update Orderที่ Developerกำหนด
บาง Migrationต้องทำระหว่าง Maintenance
130. Maintenance Windowมีประโยชน์
เพราะลดเวลาที่:
Code Versionหนึ่ง
Schemaอีก Versionหนึ่ง
ทำงานพร้อมกัน
131. Zero-downtime Migrationซับซ้อนกว่า
Serverทั่วไปไม่จำเป็นต้องออกแบบเองถ้าไม่มีความต้องการ
132. Backupก่อน Migration
ควรทำเสมอสำหรับ Production
133. Partial Migration
ถ้า Migrationเพิ่ม Columnบางตัวสำเร็จแล้ว Errorตรงกลาง
Resourceเก่าอาจเริ่มขึ้น 1136
134. อย่า Run SQL Fileซ้ำทันที
ตรวจ Schema Stateก่อน
135. เพราะอาจเจอ:
Duplicate Column
Duplicate Key
ตามมา
136. SHOW CREATE TABLEช่วยมาก
SHOW CREATE TABLE your_table;
ใช้เปรียบเทียบกับ Official Schema
137. DESCRIBEช่วยนับ Columns
DESCRIBE your_table;
แต่ต้องรู้ว่า Queryใช้ Column Listหรือไม่ด้วย
138. SHOW COLUMNS ก็ใช้ตรวจโครงสร้างได้
Database Toolsหลายตัวมี UIให้ดูเช่นเดียวกัน
139. อย่านับ Columnsใน phpMyAdminอย่างเดียวถ้า Queryระบุ Column List
เพราะ Countที่ต้องตรงคือ Listใน Query
140. วิธีนับ Query
ตัวอย่าง:
INSERT INTO users
(a, b, c, d)
VALUES (?, ?, ?, ?);
นับ:
a = 1
b = 2
c = 3
d = 4
Values:
? = 1
? = 2
? = 3
? = 4
ถูก
141. Queryยาว 30 Columns
Formatหลายบรรทัดช่วยนับ
INSERT INTO players (
identifier,
firstname,
lastname,
job,
metadata
)
VALUES (
?,
?,
?,
?,
?
);
142. One Column Per Lineช่วย Debugมาก
เห็น Missing Valueง่าย
143. Formatไม่กระทบ SQL Logic
แต่เพิ่ม Maintainability
144. Resource Queryหนึ่งบรรทัดยาวมาก
ควร Reformatใน Development Environmentก่อนแก้
145. อย่าเปลี่ยน Production Sourceโดยไม่ Backup
โดยเฉพาะ Paid/Custom Resources
146. Git Diffช่วยหาได้
ถ้า Errorเริ่มหลัง Commitล่าสุด
ดูว่า:
Columnเพิ่ม
Parameterเพิ่ม/หาย
ตรงไหน
147. Version Controlมีประโยชน์มากกับ SQL
เพราะ Changeเพียงหนึ่ง Fieldก็สร้าง Error1136ได้
148. Console Stack Trace
ดู:
Resource
File
Line
ช่วยหา INSERTเร็วขึ้น
149. Example
@myphone/server.lua:125
เปิดบรรทัดแถว 125
150. Search Error Columnไม่ได้ช่วยเสมอ
1136อาจไม่บอกชื่อ Column
จึงต้องดู Queryเต็ม
151. Database Resource Loggingมีประโยชน์
อาจแสดง SQL Statementที่ Fail
152. ระวัง Parametersใน Logs
อาจมีข้อมูล:
Player identifiers
Personal data
ก่อนโพสต์ Publicควร Maskส่วนที่ไม่จำเป็น
153. Passwordไม่ควรอยู่ใน Error Report
อย่าโพสต์ Connection Stringเต็ม
154. Error1136จาก Closed-source Resource
ถ้าไม่เห็น Query:
ใช้ Official Support
Resource Version
Database Schema
เป็นหลัก
155. ส่ง Errorเต็มให้ Developer
พร้อม:
Resource Version
Framework
Database Engine/Version
สิ่งที่เพิ่ง Update
โดยไม่ส่ง Credentials
156. อย่าแก้ Tableให้เข้ากับ Errorแบบเดา
Closed-source Resourceอาจมี Migrationที่คุณไม่ได้ Run
157. Errorหลัง Resource Escrow Update
ตรวจ SQL/Migration Filesที่มากับ Package
158. Resource SQL Fileคนละ Version
อาจเป็นต้นเหตุ
Code v4 + SQL v3ไม่ควรใช้ร่วมกันโดยไม่ Migration
159. Errorหลัง Rollback Resource
ถ้า Schemaถูก Upgradeไปแล้วแต่ Codeกลับเป็น Versionเก่า:
INSERT VALUESเก่าอาจ Countไม่ตรง
160. Rollbackต้องคิดถึง Databaseด้วย
Code Rollbackอย่างเดียวไม่พอเสมอไป
161. Database Backupก่อน Updateจึงสำคัญ
ช่วยย้อน Code+Schemaให้ตรง Versionเดิม
162. Error1136ใน FiveM Phone
อาจเกิดตอนสร้าง:
Phone account
Contact
Message
หาก Phone Resource Schemaเปลี่ยน
163. Error1136ใน Garage
อาจเกิดตอนซื้อรถ/Saveรถใหม่
ถ้า Owned Vehicle Tableมี Custom Columnsเพิ่ม
164. Error1136ใน Housing
อาจเกิดตอนสร้าง Property Ownership Record
165. Error1136ใน Business
อาจเกิดตอน:
Create Business
Add Employee
166. Error1136ใน Billing
อาจเกิดตอน Insert Invoice Record
167. Error1136ใน Banking
อาจเกิดตอนสร้าง Transaction History
168. Error1136ใน Inventory
อาจเกิดตอน Insert Item Rowsแบบ Bulk
169. Error1136ใน Jobs
มักเกิดตอน Import/Seed:
jobs
grades
170. Error1136ใน Whitelist
อาจเกิดตอนเพิ่ม Identifierพร้อมข้อมูลประกอบ
171. Error1136ใน Ban System
เช่น Resourceเพิ่ม Field:
reason
expires
staff
แต่ INSERTยังเป็น Versionเก่า
172. Errorเฉพาะ Featureหนึ่ง
โฟกัส Table/Resourceของ Featureนั้น
ไม่ต้อง Reset Databaseทั้งหมด
173. Errorทุก Characterใหม่
น่าสงสัย Core Character INSERT
174. Characterเก่า Loginได้แต่สร้างใหม่ไม่ได้
ยิ่งชี้ไปที่:
INSERT creation query
มากกว่า SELECT Login
175. Errorตอน Saveแต่ไม่ตอน Create
ตรวจ INSERT ที่ Resourceใช้สร้าง Sub-recordใหม่ตอน Save
เช่น Transaction/Inventory Records
176. UPDATEเกิด 1136ได้ไหม
ข้อความ Column count mismatchมักสัมพันธ์กับ Value Rowใน INSERT-style operations มากกว่า
ถ้า UPDATEผิดโครงสร้างมักได้ Errorอื่น
177. อย่าค้นเฉพาะ UPDATE
เมื่อเห็น 1136ให้หา INSERTก่อน
178. INSERT ... SET มีไหม
MariaDBมีรูปแบบ Insertหลายแบบ แต่ FiveM Resourcesส่วนใหญ่อาจใช้ Column List+Values
ให้ดู Queryจริง
179. Resourceใช้ Object Insert API
Database Wrapperบางตัวอาจสร้าง SQLให้
ถ้า Object Mappingผิด:
Generated SQLอาจ Error
180. ORM/Query Builder
อาจซ่อน SQLจาก Developerระดับบน
ควร Log Generated Queryตอน Debug
181. Generated Queryคือ Source of Truth
เพราะ Databaseเห็น Queryสุดท้าย
182. Bulk Query Builder
ต้องทำให้ทุก Rowมี Keysชุดเดียวกันหรือ Mappingที่ Libraryรองรับ
183. Objectหนึ่งขาด Property
อาจทำ Value Countไม่เหมือน Rowsอื่น
184. Example
Row 1:
name, label, weight
Row 2:
name, label
Bulk Generatorที่ไม่ Handle Missing Fieldอาจสร้าง SQLผิด
185. Normalize Objectsก่อน Build SQL
ให้ Fieldsครบตาม Schema
186. Optional Dataใช้ Explicit Mapping
ดีกว่า Object Keysแบบสุ่ม
187. JavaScript Object Property Orderควรพึ่งไหม
สำหรับ Database Mappingควรกำหนด Columnsชัดเจน
ไม่ควรพึ่ง Dynamic Object Structureโดยไม่ตรวจ
188. Lua Tableก็เช่นกัน
หาก Build Queryจาก Table Keysแบบ Dynamicต้องกำหนด Mappingชัด
189. Dynamic Array Placeholder Generation
ถ้ามี 5 Columnsต้อง Generate 5 Placeholdersต่อ Row
190. Off-by-one Bug คืออะไร
Loopสร้างจำนวน Placeholderมาก/น้อยกว่าหนึ่ง
เกิด Error1136ได้
191. ตัวอย่างแนวคิด
ต้องการ 5:
?, ?, ?, ?, ?
แต่ Generatorสร้าง:
?, ?, ?, ?
192. Unit Testช่วยได้
Custom Developerควร Test:
1 Row
หลาย Rows
Optional Fields
193. Database Integration Testยิ่งดี
Run Queryกับ Schemaจริงของ Test Environment
194. Dev Databaseควร Schemaเหมือน Production
ไม่เช่นนั้น Queryอาจผ่าน Devแต่ Fail Production
195. Productionมี Custom Columnมากกว่า Dev
เป็นสาเหตุ Classicของ INSERT INTO table VALUES
196. Schema Drift คืออะไร
Dev, Staging และ Productionมี Schemaไม่เหมือนกัน
197. ลด Schema Drift
ใช้:
Migration Files
Version Tracking
198. อย่าแก้ Productionด้วย phpMyAdminแล้วไม่บันทึก Migration
ไม่เช่นนั้น Devไม่รู้การเปลี่ยนแปลง
199. Schema Driftทำให้ Errorหลัง Deployยากมาก
เพราะ Codeถูก Testกับ Tableคนละโครงสร้าง
200. Resource Installation Guideสำคัญ
อย่าข้าม Step SQL Migration
201. Error1136หลังเพิ่ม Generated Column
Queryเก่าที่ใช้ VALUESทุก Columnอาจต้องปรับ
202. Generated Columnไม่ควรได้รับค่าทั่วไปแบบ Columnปกติในหลายกรณี
MariaDB documentationระบุว่า Generated Columnถูกสร้างจาก Expressionแทนค่าที่ Applicationกำหนดโดยตรง
203. Queryใหม่ควรระบุ Fieldsที่เขียนจริง
อีกเหตุผลให้ใช้ Explicit Column List
204. Error1136กับ AUTO_INCREMENT
ถ้าเพิ่ม Auto Increment IDใหม่ด้านหน้า Table
Queryเก่าแบบ:
INSERT INTO table VALUES(...)
อาจต้องเปลี่ยน
205. ไม่ควร Hardcode IDใหม่
ถ้า Databaseควร Generateเอง
206. MariaDB AUTO_INCREMENT
ใช้สำหรับสร้างค่า Uniqueต่อเนื่องให้ Columnตาม Schema และสามารถรับค่า Generatedจาก INSERTได้
207. Error1136หลังเพิ่ม Timestamp Columns
เช่น:
created_at
updated_at
ถ้า Queryใช้ INSERT VALUESทุก Columnอาจ Countเปลี่ยน
208. ถ้า Timestampมี Default
Explicit Column Listช่วยละ Fieldได้
209. ไม่ต้องส่ง NOW()ทุกครั้งถ้า Schemaจัดการ Defaultเอง
แต่ต้องดู Resource Logicจริง
210. อย่าปรับ Defaultเพื่อหลบ Errorโดยไม่เข้าใจ
เพราะ created_at และ updated_at อาจมี Meaningต่างกัน
211. Error1136หลัง Add Soft Delete
Schemaอาจเพิ่ม:
deleted_at
Resourceเก่าไม่รู้ Columnนี้
Explicit Columnsลดผลกระทบถ้า Fieldมี Default/NULL
212. Legacy Scriptsมีความเสี่ยงมากกว่า
โดยเฉพาะ Scriptที่เขียน Queryแบบ:
INSERT INTO some_table VALUES (...)
213. Modernize Query
ถ้าคุณควบคุม Sourceได้:
ระบุ Columnsชัดเจน
214. แต่ Third-party Scriptควร Patchตาม Official Updateก่อน
เพราะ Custom Patchอาจถูกเขียนทับ
215. Document Custom Patch
ถ้าจำเป็นต้องแก้เอง
จด:
File
Query
Resource Version
216. Error1136ไม่ควรใช้ INSERT IGNORE แก้
INSERT IGNOREมีหน้าที่เปลี่ยน Handlingของ Errorsบางประเภท ไม่ได้ทำให้จำนวน Columns/Valuesผิดกลายเป็น Queryที่ถูกต้องตาม Design
217. ON DUPLICATE KEY UPDATE ก็ไม่เกี่ยว
ใช้จัดการ Duplicate Key
ไม่ใช่ Column Count
218. REPLACE ก็ไม่ใช่คำตอบ
ถ้า Countของ Valuesยังผิดก็ไม่ได้แก้ Root Cause
219. อย่าผสม Error274กับ277
274
Duplicate Entry
277
Wrong Value Count
คนละเรื่อง
220. Error275ก็คนละเรื่อง
1406
ข้อมูลยาวเกิน Column
1136
จำนวน Valuesไม่ตรง
221. Error276
1064
SQL Syntaxผิด
222. Database Error Map
1062 → Duplicate Entry
1064 → SQL Syntax
1136 → Column/Value Count
1292 → Invalid Value/Datetime
1406 → Data Too Long
223. วิธีแก้เร็วที่สุดเมื่อเห็น 1136
Copy Query
Formatหลายบรรทัด
นับ Columns
นับ Values/Placeholders
ดู Rowที่ Error
ตรวจ Parameters
224. ถ้า Queryไม่ระบุ Columns
ตรวจ Table Schemaแล้วเปลี่ยน Queryให้ระบุ Columnsหาก Resource Designอนุญาต
225. ถ้าเป็น Third-party Resource
อย่า Rewriteเองทันที
ตรวจ Migration/Updateก่อน
226. ถ้า Errorหลังคุณเพิ่ม Columnเอง
นั่นเป็นเบาะแสสำคัญมาก
ตรวจ Resourcesที่ใช้ INSERT INTO table VALUES
227. ถ้า Errorหลัง Update Framework
ตรวจ Migration Order
228. ถ้า Errorหลัง Restore
ตรวจ Backup Schema Version
229. ถ้า Errorเฉพาะ Bulk Import
ดู Value Rowตามหมายเลขใน Error
230. ถ้า Errorเฉพาะ Rowหนึ่ง
Rowนั้นอาจขาด Fieldจาก Generator
231. Error1136 FAQ
FiveM Column count doesn't match value count คืออะไร
หมายถึง INSERT กำลังให้จำนวน Values ไม่ตรงกับจำนวน Columns ที่ Statementคาดไว้ โดย MariaDBใช้ Error 1136 / SQLSTATE 21S01 / ER_WRONG_VALUE_COUNT_ON_ROW
at row 1 หมายถึง ID 1ไหม
ไม่ หมายถึง Value Rowลำดับหนึ่งใน Statementที่กำลัง Insert ไม่ใช่ Primary Key ID = 1
แก้อย่างไรเร็วที่สุด
นับ:
Columns
Values
Placeholders
Parameters
ให้ตรงกัน
มี 4 Columns ต้องมี 4 Valuesไหม
หาก Column Listระบุ 4 Columns แต่ละ Rowใน VALUESควรให้ค่าแก่ Columnsทั้ง 4 ตามลำดับ
Tableมี 20 Columns ต้องส่ง20 Valuesไหม
ไม่จำเป็นถ้า Queryระบุ Column Listเฉพาะ Fieldsที่ต้อง Insert และ Columnsอื่นสามารถใช้ Default/NULLตาม Schemaได้
INSERT INTO table VALUES(...) เสี่ยงไหม
มีความเปราะบางกว่าเมื่อ Schemaเปลี่ยน เพราะไม่มี Explicit Column List; MariaDB guidanceแนะนำให้ระบุ Column Namesเพื่อหลีกเลี่ยงปัญหาเมื่อโครงสร้าง Tableเปลี่ยน
Errorเกิดหลังเพิ่ม Columnทำอย่างไร
ตรวจ Resourcesที่ Insert Tableนั้น โดยเฉพาะ Queryที่ไม่ได้ระบุ Column Names
Errorเกิดหลัง Update Resource
ตรวจ Database Migrationและ Resource Version
Errorเกิดหลัง Framework Update
ตรวจว่า Schemaและ Resourcesทั้งหมดรองรับ Framework Versionใหม่
Errorเกิดหลัง Import SQL
ตรวจ Value Rowตามหมายเลขที่ Errorแจ้ง และดูว่าแต่ละ Rowมีจำนวน Valuesเท่ากันหรือไม่
Bulk INSERTทำ Error1136ได้ไหม
ได้ หาก Value Listใน Rowใด Rowหนึ่งมีจำนวนข้อมูลไม่ตรงกับ Column List
INSERT SELECTทำ Errorได้ไหม
ได้ ถ้าจำนวน Columnsที่ Targetต้องการไม่สัมพันธ์กับจำนวน Expressions/Columnsที่ SELECTส่งกลับ
SELECT * ควรใช้ Migrationไหม
ควรหลีกเลี่ยงเมื่อ Source/Target Schemaอาจเปลี่ยน การระบุ Columnsชัดเจนช่วยลดปัญหา Schema Changes
AUTO_INCREMENTต้องส่ง Valueไหม
ไม่จำเป็นเสมอไป หาก Columnถูกออกแบบให้ Databaseสร้างค่าเองและ Queryละ Columnนั้นอย่างถูกต้อง
เพิ่ม NULLให้ครบได้ไหม
ไม่ควรทำแบบสุ่ม ต้องดูว่า Columnนั้นรองรับ NULLและความหมายข้อมูลถูกต้องหรือไม่
เพิ่ม Empty Stringให้ครบได้ไหม
ไม่ควร เพราะ Empty Stringไม่เท่ากับ NULLหรือ Default
ลบ Columnให้ Countตรงได้ไหม
ไม่ควร ถ้า Columnเป็นส่วนหนึ่งของ Schemaที่ Resourceอื่นต้องใช้
เปลี่ยน Database Passwordช่วยไหม
ไม่ เพราะ Errorนี้เกิดหลัง Queryไปถึง Databaseแล้ว
Clear FiveM Cacheช่วยไหม
โดยทั่วไปไม่ใช่ Fixของ Database Error 1136
Restart MariaDBช่วยไหม
ไม่ หาก Queryยังส่งจำนวน Valuesผิด
Restart FiveMช่วยไหม
ไม่แก้ Source Queryที่ผิด แต่หลังแก้ Resource Codeอาจต้อง Reload/Restartตามระบบ
ต้องลบ Databaseไหม
ไม่ควรอย่างยิ่ง Error1136ส่วนใหญ่แก้ได้ที่ Query, Migrationหรือ Schema Compatibility
Errorเฉพาะ Characterใหม่คืออะไร
ตรวจ Character Creation INSERT
Characterเก่าเล่นได้แต่สร้างใหม่ไม่ได้
ยิ่งควรตรวจ Queryที่สร้าง Characterใหม่
Errorตอนซื้อรถ
ตรวจ Garage/Vehicle Ownership INSERT
Errorตอนเพิ่ม Item
ตรวจ Inventory Bulk Insert/Item Row Mapping
Errorตอนสร้าง Business
ตรวจ Business Record Insert
Errorหลัง Rollback Resource
Database Schemaอาจยังเป็น Versionใหม่ แต่ Codeถูกย้อนเป็น Versionเก่า
วิธีป้องกันในอนาคต
ใช้:
Explicit Column Lists
Database Migrations
Schema Version Control
Test Environment
สรุป FiveM MySQL Column Count Doesn't Match Value Count Error 1136
FiveM MySQL/MariaDB Error 1136 Column count doesn't match value count at row เกิดเมื่อจำนวน Values ที่ Resource พยายาม INSERT ไม่สัมพันธ์กับจำนวน Columns ที่ Statement ต้องการ โดย MariaDB กำหนด Error นี้เป็น ER_WRONG_VALUE_COUNT_ON_ROW และ SQLSTATE 21S01
ตัวอย่างที่ควรจำ:
INSERT INTO players
(firstname, lastname, job)
VALUES ('John', 'Smith');
ผิดเพราะ:
3 Columns → 2 Values
ส่วน:
INSERT INTO players
(firstname, lastname, job)
VALUES ('John', 'Smith', 'police');
มีจำนวนและลำดับ Valuesสัมพันธ์กับ Column List ตามรูปแบบ INSERT ของ MariaDB
สิ่งที่ comsiam แนะนำคือ ถ้าเจอ Error นี้หลัง Update FiveM Resource, Framework หรือ Database Schema อย่ารีบลบ Columnหรือใส่ค่า NULL/Empty Stringเพื่อให้จำนวนครบ แต่ให้หา Queryต้นทางแล้วตรวจ Column List → Placeholders → Parameters → Schema Version เพราะ Errorอาจเป็นสัญญาณว่า Codeกับ Databaseกำลังใช้คนละ Version
อีกหลักที่ comsiam แนะนำคือสำหรับ Custom FiveM Resources ควรหลีกเลี่ยงการเขียน INSERT INTO table VALUES(...) โดยไม่ระบุ Column Names เมื่อ Tableมีโอกาสถูก Migrationหรือเพิ่ม Fieldsในอนาคต การระบุ Columnsให้ชัดเจนช่วยลดความเปราะบางเมื่อ Schemaเปลี่ยน และ MariaDBเองก็แนะนำแนวทางนี้สำหรับ Database Applications
Comments
Post a Comment