FiveM MySQL Incorrect Integer Value Error 1366 แก้อย่างไร? ตรวจ INT, String, Empty Value และ Schema ให้ตรง Resource
ปัญหา FiveM MySQL/MariaDB ขึ้น Incorrect integer value หรือ Error 1366 มักเกิดเมื่อ Resource พยายามบันทึกค่าที่ไม่สามารถใช้เป็นตัวเลขได้อย่างถูกต้องลงใน Column ประเภทตัวเลข เช่น INT, TINYINT หรือ Numeric Field อื่น
ตัวอย่าง Error:
ERROR 1366 (22007): Incorrect integer value: '' for column 'job_grade' at row 1
Incorrect integer value: 'police' for column 'grade'
Incorrect integer value: 'undefined' for column 'state'
Incorrect integer value: 'false' for column 'stored'
ER_TRUNCATED_WRONG_VALUE_FOR_FIELD
MariaDB ระบุ Error 1366 ในกลุ่ม ER_TRUNCATED_WRONG_VALUE_FOR_FIELD และ Error ชนิดนี้สามารถปรากฏเป็น Incorrect integer value เมื่อค่าที่ส่งมาไม่สามารถใช้กับ Integer Field ตามที่ Database คาดหวังได้.
ใน FiveM ปัญหานี้อาจเกิดกับ Field เช่น:
job_grade
grade
state
stored
impounded
amount
quantity
count
slot
level
society balance
vehicle state
garage state
business grade
item amount
หลักสำคัญคือ:
อย่าเห็น Error 1366 แล้วเปลี่ยน INT เป็น VARCHAR ทันที
เพราะถ้า Field นั้นเป็นตัวเลขจริง การเปลี่ยนเป็นข้อความอาจเพียงทำให้ Error หาย แต่ทำให้ Logic ของ Resource ผิดในภายหลัง
วิธีแก้ที่ถูกต้องคือ:
อ่านข้อความ Error → หา Column → ดู Actual Value → ตรวจ Data Type → หา Resource/Query → ตรวจ Mapping → แก้ค่าหรือ Schema ที่ต้นเหตุ
① Error 1366 คืออะไร
ในบริบท Incorrect integer value หมายถึง Database ได้รับค่าที่ไม่เหมาะกับ Column ตัวเลข และไม่สามารถจัดเก็บตามเงื่อนไขปัจจุบันได้.
② ตัวอย่างง่ายที่สุด
Column:
job_grade INT NOT NULL
แต่ Resource ส่ง:
job_grade = ''
String ว่างไม่ใช่ Integer ที่ถูกต้องสำหรับ Logic นี้
③ ตัวอย่างอีกแบบ
grade = 'police'
แต่ Column คือ:
grade INT
Resource กำลังส่งชื่อ Job เข้า Field ที่ควรเป็น Grade Number
④ ปัญหาอาจไม่ใช่ Database Schema
อาจเป็น:
Parameter Order ผิด
Variable ผิด
Framework Bridge ผิด
Config ผิด
⑤ Error 1366 เป็น Connection Error ไหม
ไม่
ถ้า Database สามารถตอบว่า:
Incorrect integer value
ได้ แสดงว่า Query ไปถึง Database แล้ว
⑥ จึงไม่ควรเริ่มจาก Password
ไม่เกี่ยวกับ:
Username
Password
Port
ใน Error ลักษณะนี้
⑦ Clear FiveM Cache ช่วยไหม
โดยทั่วไปไม่ใช่ Fix หลัก
เพราะค่าผิดถูกสร้างและส่งจากฝั่ง Server Resource
⑧ Restart MariaDB ช่วยไหม
ถ้า Resource ยังส่งค่าเดิม:
Error จะกลับมา
⑨ INT คืออะไร
MariaDB INT เป็น Numeric Data Type สำหรับ Integer และมีช่วงค่าที่รองรับตามชนิดของ Column.
⑩ Integer คืออะไรแบบง่าย
จำนวนเต็ม เช่น:
0
1
2
10
-1
ไม่ใช่:
police
abc
undefined
⑪ Decimalเป็น Integerไหม
ค่าเช่น:
10.5
ไม่ใช่จำนวนเต็ม แม้ Databaseอาจมี Conversion Behaviorบางแบบตาม Type/SQL Mode
ถ้าต้องเก็บทศนิยมควรใช้ Data Typeที่ Resourceออกแบบไว้
⑫ String "10" กับ Number 10
Applicationอาจมี:
"10"
เป็น String
กับ:
10
เป็น Number
Database/Driverอาจ Conversionได้ในบาง Context แต่ Custom Resourceไม่ควรพึ่งการแปลงประเภทแบบคลุมเครือ
⑬ ควร Normalize Type ก่อน Query
ถ้า Fieldควรเป็น Number:
Resourceควรตรวจและแปลงอย่างถูกต้องก่อนส่ง Database
⑭ Errorที่พบบ่อยมากคือ Empty String
''
ถูกส่งเข้า:
INT
⑮ Empty Stringไม่ใช่ 0
นี่สำคัญมาก
''
หมายถึง Stringไม่มีตัวอักษร
ส่วน:
0
เป็น Numeric Value
⑯ อย่าเปลี่ยน Empty Stringเป็น 0ทุกกรณี
ต้องรู้ว่า 0มีความหมายอะไร
⑰ ตัวอย่าง job_grade
ถ้า:
0 = Recruit
อาจสมเหตุสมผลใน Frameworkหนึ่ง
แต่ Serverอื่นอาจใช้ Logicต่างกัน
⑱ ตรวจ Frameworkจริง
อย่าเดาค่า Gradeจาก Tutorialอื่น
⑲ Error job_grade
มักตรวจ:
Job Data
Grade Mapping
Character Creation
Framework Bridge
⑳ ตัวอย่างผิด
job = police
job_grade = police
Fieldหลังควรเป็น Gradeตาม Data Model ไม่ใช่ Job Name
㉑ Parameter Order ผิดสร้าง Errorนี้ได้
Query:
INSERT INTO jobs
(name, grade)
VALUES (?, ?);
แต่ Codeส่ง:
0
police
แทน:
police
0
㉒ Databaseจึงพยายามใส่
grade = police
แล้ว Error
㉓ จำนวน Parametersถูกไม่ได้แปลว่าถูก
ต้องดู:
Order
Type
Meaning
ด้วย
㉔ Error state
FiveM Vehicle/Garage Resourcesหลายแบบใช้ Numeric State
ตัวอย่างเชิงแนวคิด:
0
1
2
แต่ความหมายของแต่ละเลขขึ้นอยู่กับ Resource
㉕ อย่าเดาว่า 0 = Out เสมอ
บาง Resourceอาจใช้ Mappingต่าง
㉖ Error stored
Resourceหนึ่งอาจใช้:
0 / 1
อีก Resourceอาจใช้ Boolean หรือ Schemaอื่น
㉗ Boolean กับ Integerต้องแยก
Applicationอาจส่ง:
true
false
แต่ Database Columnเป็น Integer
㉘ Driverอาจ Convertหรือไม่ Convert
ไม่ควรพึ่งพาโดยไม่รู้ API
Resourceควร Mappingให้ชัด
㉙ ตัวอย่างที่ชัดกว่า
stored = true
Applicationอาจแปลงเป็น:
1
ถ้า Resource Designกำหนดแบบนั้น
㉚ แต่ต้องทำอย่างตั้งใจ
ไม่ใช่หวังว่า Databaseจะ Convertเอง
㉛ Error amount
อาจเกิดตอน:
Banking
Billing
Item Purchase
㉜ ตัวอย่างผิด
amount = "five thousand"
แต่ Columnเป็น Numeric
㉝ UIควรส่ง Number
Serverควร Validateอีกชั้น
㉞ อย่าเชื่อ Clientอย่างเดียว
ผู้เล่นอาจ:
ส่งค่าไม่ตรง UI
Resourceอื่นเรียก Eventโดยตรง
ดังนั้น Server-side Validationสำคัญ
㉟ Error quantity
Inventory Resourceอาจได้รับ:
quantity = ''
หรือ:
quantity = nil
㊱ Quantityควรตรวจ Minimum/Maximum
ไม่ใช่เพียง Convertเป็น Numberแล้วจบ
㊲ Negative Quantity ต้องระวัง
แม้เป็น Integerถูก Syntax:
-100
ก็อาจผิด Business Logic
㊳ Database Type ValidationกับGameplay Validationต่างกัน
Databaseถาม:
เป็น Integerไหม?
Resourceควรถามเพิ่ม:
เป็น Integerที่อนุญาตไหม?
㊴ ตัวอย่าง Quantity
อาจต้อง:
quantity >= 1
ตาม Resource Design
㊵ Error slot
Inventory Slotมักควรเป็น Number
ถ้าส่ง:
slot = "primary"
เข้า Integer Column:
Mappingอาจผิด
㊶ Error grade
Job Gradeอาจถูกส่งเป็น Label
เช่น:
Boss
แทน Numeric Grade
㊷ ตรวจ Job Object
Frameworkอาจมีทั้ง:
grade
grade_name
grade_label
อย่าเลือก Fieldผิด
㊸ ตัวอย่าง
ต้องการ Numeric:
grade = 4
แต่ Codeใช้:
grade_label = "Boss"
㊹ SQL Errorจึงเป็นผลปลายทาง
Root Causeคือ Application Mapping
㊺ Errorหลัง Framework Update
Framework APIอาจเปลี่ยน Object Structure
Resourceเก่าอ่าน Propertyเดิมแล้วได้:
undefined
㊻ JavaScript undefined
ถ้าถูก Convertเป็น String:
"undefined"
แล้ว Insert INT:
Errorได้
㊼ อย่า Convert undefinedเป็น 0แบบสุ่ม
ต้องหาเหตุผลว่าทำไม Variableหาย
㊽ Errorหลัง QBCore/ESX Update
ตรวจ:
Job Object
Player Data
Money Object
Character Metadata
ตาม Resourceที่ Error
㊾ Resource Bridgeสำคัญ
Third-party Scriptอาจมี:
ESX Bridge
QBCore Bridge
ถ้าเลือกผิดอาจอ่าน Data Typeผิด
㊿ Error money
เงินอาจเก็บเป็น:
INT
BIGINT
DECIMAL
ตาม Resource
อย่าเปลี่ยน Schemaจนกว่าจะรู้ Requirementจริง
51. INTกับBIGINTต่างกัน
ทั้งคู่เป็น Integer Types แต่มีช่วงค่าที่รองรับต่างกัน; BIGINT รองรับช่วงค่าที่กว้างกว่า INT.
52. ถ้าเงินมากเกิน INT
อาจเกิด Out-of-range Error ไม่ใช่เพียง Incorrect Integer Value
จึงต้องแยก:
Typeไม่ถูก
Numberใหญ่เกิน Range
53. Out-of-range คืออะไร
ค่าตัวเลข:
ใหญ่เกิน
เล็กเกิน
ช่วงที่ Data Typeรองรับ
MariaDBระบุว่าเมื่อใช้ Strict Mode ค่า Out-of-rangeของ INTสามารถทำให้ Operationเกิด Errorแทนถูกปรับเข้า Range.
54. อย่าแก้ด้วย BIGINTทันที
ถามก่อนว่า:
ค่าควรใหญ่ขนาดนั้นจริงไหม?
55. Economy Bugอาจทำเงินผิดปกติ
เช่น Resourceคำนวณ:
999999999999999999
จาก Bug
เพิ่ม Columnเป็น BIGINTอาจเพียงซ่อน Exploit/Bug
56. ต้องตรวจ Business Logic
โดยเฉพาะ:
Money
Quantity
Price
Salary
57. Error amountจาก Comma
User Inputอาจเป็น:
1,000
Stringนี้ไม่เหมือน Numeric:
1000
58. UI FormattingกับDatabase Valueควรแยก
UIแสดง:
1,000
แต่ Serverควรส่ง Numeric Valueที่ Validateแล้ว
59. Currency Symbolก็เช่นกัน
ไม่ควรส่ง:
฿5000
ลง Integer Field
60. Percentก็เช่นกัน
50%
เป็น Display String
ไม่ใช่ Numeric 50โดยตรง
61. Parse Numberใน Server
ต้องตรวจ Resultหลัง Parse
ไม่ใช่เพียงเรียก Conversionแล้วใช้ต่อ
62. NaN คืออะไร
JavaScriptสามารถได้:
NaN
เมื่อ Conversionเป็น Numberไม่สำเร็จ
63. NaNไม่ควรถูกส่ง Database
ควร Validate:
is finite?
is integer?
ตาม Requirement
64. Lua tonumber
Custom Lua Resourceอาจใช้ tonumber()เพื่อแปลง Inputเป็น Number
หากแปลงไม่ได้อาจได้:
nil
จึงต้องตรวจผลก่อน Query
65. อย่าทำ
tonumber(input) or 0
ทุกกรณี
เพราะ Inputผิดจะถูกเปลี่ยนเป็น 0แบบเงียบ ๆ
66. ตัวอย่างอันตราย
Playerกรอก:
abc
ระบบแปลงไม่ได้
แล้วกลายเป็น:
0
Transactionอาจทำงานผิด
67. Better Validation
ถ้า Conversionไม่ได้:
Reject Request
68. Error level
XP/Level Systemอาจส่ง:
level = "beginner"
เข้า INT
ถ้า Schemaคาด Numeric Level:
ผิด Mapping
69. LabelกับValueต้องแยก
เช่น:
level = 5
level_label = Expert
70. Error rank
Rankบางระบบเป็น:
Integer
บางระบบเป็น:
String
ต้องดู Schemaจริง
71. อย่าคิดว่า Columnชื่อ rankต้อง INTเสมอ
Resourceเป็น Source of Truth
72. Error status
บาง Systemsใช้:
0 / 1
บาง Systemsใช้:
pending
paid
cancelled
จึงอาจต้องเป็น VARCHAR/ENUMแทน
73. ถ้า Resourceส่ง Stringถูกต้องตาม Designแต่ Schemaเป็น INT
นี่อาจเป็น Schema Version mismatch
74. Example Billing Migration
Versionเก่า:
status INT
Versionใหม่:
status VARCHAR(...)
แต่ Databaseไม่ได้ Migration
75. อย่าแก้ Codeให้กลับไปส่งเลขทันที
ตรวจ Official Migrationก่อน
76. Expected Schema vs Actual Schema
ใช้หลักเดียวกับ Errorsก่อนหน้า
77. ตรวจ Actual Schema
SHOW CREATE TABLE your_table;
78. หรือ
DESCRIBE your_table;
79. ดู Columnที่ Error
เช่น:
grade INT
80. เทียบ Official SQL
ถ้า Official Resource Versionระบุ:
grade VARCHAR(...)
แสดงว่า Production Schemaไม่ตรง
81. Migrationหาย
เป็น Root Causeที่เป็นไปได้สูง
82. Errorเฉพาะหลัง Resource Update
ยิ่งควรตรวจ Migrationก่อน
83. Errorเฉพาะหลัง Restore Backup
Backupอาจ Restore Schemaเก่ากลับมา
84. Errorหลัง Rollback Code
Databaseอาจยังเป็น Schemaใหม่
85. Code/Schemaต้องเป็น Versionคู่กัน
นี่เป็นหลักสำคัญที่สุดข้อหนึ่ง
86. Error 1366กับ DECIMAL
หาก Fieldต้องเก็บเงินที่มีทศนิยม Resourceอาจใช้ DECIMAL แทน Integer และ MariaDBมี Range/Precision Rulesเฉพาะ.
87. อย่าใช้ FLOATกับเงินเพียงเพราะมีทศนิยม
Data Typeทางการเงินควรยึด Resource Designและ Precision Requirement
88. Error Price
ถ้า Resourceส่ง:
100.50
แต่ Columnเป็น INT
Database/SQL Modeอาจมี Conversion Behavior
ควรตัดสินใจว่า Priceควร:
Integer
Decimal
ตามระบบ
89. FiveM Economyหลาย Serverใช้จำนวนเต็ม
แต่ไม่ใช่กฎสากล
90. Error weight
Inventory Weightบางระบบเป็น:
Integer
Decimal
ขึ้นอยู่กับ Resource
91. อย่าปรับ INT→FLOATจาก Guess
ตรวจ Official Schema
92. Error duration
เช่น:
Ban Duration
Cooldown
อาจใช้:
Seconds
Minutes
Timestamp
เป็น Integer
93. ส่ง Stringเช่น
2 hours
เข้า Integer Fieldไม่ถูก
94. UIควร Convertเป็น Numeric Unitก่อน
เช่น Resourceกำหนด:
seconds
ก็ส่ง Seconds
95. Unit Conversionต้องชัด
อย่าสับสน:
seconds
milliseconds
96. Millisecondsยังเป็น Integer
แต่ค่าจะใหญ่กว่ามาก
97. INTอาจเล็กเกิน Timestampบางแบบ
ถ้าใช้ Milliseconds:
ค่ามักใหญ่มาก
Resourceอาจต้อง BIGINTหรือ Data Modelอื่น
98. อย่าเพิ่ม BIGINTจนกว่าจะตรวจ Design
บางที Resourceควรใช้ Secondsแต่ Codeส่ง Millisecondsผิด
99. Errorอาจเป็น Out-of-rangeแทน 1366
จึงอ่าน Errorเต็ม
100. Error 1366 ไม่ได้มีเฉพาะ Integer
ชื่อ ER_TRUNCATED_WRONG_VALUE_FOR_FIELD เป็น Error Familyที่สามารถเกิดกับ Value/Field Typesอื่นตาม Contextได้ ดังนั้นต้องอ่านข้อความหลัง Error Codeให้ครบ.
101. ถ้าข้อความบอก Incorrect integer value
โฟกัส Integerก่อน
102. ถ้าข้อความบอก Typeอื่น
อย่าใช้บทความนี้แทน Error Contextทั้งหมด
103. Error Incorrect integer value: ''
เป็นหนึ่งใน Patternที่ชัดที่สุด
104. คำถามแรก
ทำไม Valueถึงกลายเป็น:
''
105. Input Fieldว่าง
เช่น Form:
Grade:
Player/Staffไม่ได้กรอก
106. UIควร Require Fieldถ้าจำเป็น
แต่ Serverก็ต้อง Validate
107. เพราะ Client Validation Bypassได้
Serverเป็นจุดสุดท้ายก่อน Database
108. Errorจาก Admin Menu
Staff Menuอาจส่ง Gradeเป็น Empty Stringถ้าไม่ได้เลือก Dropdown
109. Fixที่ UIอย่างเดียวไม่พอ
Server Callbackควร Reject Empty Grade
110. Errorจาก Config
เช่น:
defaultGrade = ""
แล้ว Resource Insertลง INT
111. Config Typeต้องถูก
ถ้าต้อง Number:
defaultGrade = 0
ตาม Resource Documentation
112. แต่ห้ามเปลี่ยนเป็น 0ถ้า Resourceไม่กำหนดแบบนั้น
113. Errorจาก JSON Config
JSON:
{
"grade": ""
}
ต่างจาก:
{
"grade": 0
}
114. Errorจาก Lua Config
grade = "0"
เป็น String
ส่วน:
grade = 0
เป็น Number
115. Database Driverอาจ Convert "0"
แต่ Codeควรใช้ Typeให้ตรงตั้งแต่ต้น
116. Errorจาก Environment Variables
Environment Variablesมักถูกอ่านเป็น String
ถ้าต้อง Integer:
Parse
Validate
ก่อนใช้
117. Example Server Port/Configต่าง Topic
หลักเดียวกันกับ Numeric Configurationอื่น
118. Errorจาก API Response
Resourceอาจรับ Dataจาก External APIเป็น String
ก่อน Saveลง Integerต้อง Validate
119. อย่า Trust External Data
ตรวจ:
Numeric
Range
Required
120. Error false
บาง JavaScript/Lua Bridgeอาจแปลง Booleanเป็น String:
"false"
ซึ่งไม่ใช่ Integer
121. Mapping Booleanชัดเจน
ถ้า Schemaใช้ 0/1:
Resourceควร map:
false → 0
true → 1
ตาม Design
122. TINYINTพบกับ Boolean-like Stateบ่อย
MariaDB TINYINT เป็น Integer Typeขนาดเล็ก และ Strict Modeสามารถทำให้ค่าที่อยู่นอกช่วงถูก Reject.
123. TINYINT(1) เป็น Booleanเสมอไหม
อย่าพึ่งชื่อ Display Widthเพื่อตัดสิน Business Meaning
ดู Resource Logicจริง
124. stored/active/disabledอาจใช้ 0/1
แต่ไม่ใช่ Universal FiveM Convention
125. Errorจาก Checkbox
HTML/UI Checkboxอาจส่ง:
on
แทน 1
ถ้า Resourceนำ String on เข้า INT:
Errorได้
126. Serverควร Convert State
ไม่ควรเอา Raw Form Valueเข้า Databaseตรง ๆ
127. Errorจาก Select Option
Option Valueอาจเป็น:
boss
แต่ Databaseต้องการ Grade Number
128. UI Label vs Value
ควรเป็นแนวคิด:
Label = Boss
Value = 4
หาก Backendต้องการ Numeric Grade
129. Errorจาก NUI Callback
ตรวจ Payloadจริง
เช่น:
{
"grade": "Boss"
}
แต่ Serverคาด:
{
"grade": 4
}
130. FiveM NUIใช้ JSON Data
Typeสามารถเปลี่ยนระหว่าง UIและServerได้หาก Codeแปลงผิด
131. Debug Payload
ดูค่าก่อน Queryใน Development
132. ไม่ควร Print Player Dataจำนวนมาก Production
Loggingควรเฉพาะจุด
133. Errorเฉพาะบาง Job
อาจ Job Configหนึ่งกำหนด Gradeผิด Type
134. Example
ตำรวจ:
grade = 2
ทำงาน
Mechanic:
grade = "boss"
Error
135. จึงไม่ควรแก้ Database
แก้ Configของ Mechanic
136. Errorเฉพาะ Jobใหม่
ยิ่งชี้ไปที่ Job Seed/Config
137. Errorหลัง Import Jobs SQL
ตรวจ Column Typeและ Seed Values
138. SQL Seedผิดเองได้
เช่น:
INSERT INTO job_grades (grade)
VALUES ('boss');
แต่ gradeเป็น INT
139. อาจมี Column labelสำหรับ "Boss"
ควรใช้ Fieldที่ถูก
140. Error Item Weight
Item SQLอาจเขียน:
weight = "1kg"
แต่ Columnคือ INT
141. ควรใช้ Numeric Unitที่ Inventory Resourceกำหนด
เช่น Gram หรือ Unitอื่น
ไม่ควรเดา
142. Weight Unitต่างกันตาม Resource
Inventory Aใช้ค่าหนึ่ง
Inventory Bอาจตีความต่าง
143. Error Item Count
Seed Dataอาจใช้:
count = unlimited
แต่ Schemaต้อง Number
ตรวจ Resource Format
144. Error Vehicle Price
Vehicle SQLอาจใช้:
price = '50,000'
Commaทำให้เป็น String Formatting
145. Database Valueควรเป็น Numeric
ถ้า Schemaเป็น INT
50000
ไม่ใช่ Display Formatting
146. Error Vehicle Categoryไม่ควรเป็น INTถ้าเป็น String Category
ถ้า Schemaจริงคือ INTแต่อีก Resourceส่งชื่อ Category:
Version mismatch
Schema mismatch
อาจเป็นต้นเหตุ
147. Error Garage ID
บาง Scriptใช้:
garage_id INT
อีก Scriptใช้:
garage = 'legion'
เป็น String
148. เปลี่ยน Garage Scriptโดยไม่ Migration
จึงเกิด Incorrect Integer Valueได้ง่าย
149. นี่เป็นตัวอย่าง Schema Conflict
Resource AและBใช้ Fieldชื่อคล้ายกันแต่ Typeต่าง
150. อย่าให้ Resourcesสองตัวแชร์ Columnแบบไม่เข้าใจ
151. Error after replacing garage resource
ตรวจ:
New Table
Column Types
Migration
152. Error after replacing phone resource
Phone IDsอาจเป็น:
Numeric ID
String Number
ต่างกัน
153. Error after replacing housing
Property identifiersอาจเปลี่ยนจาก Numeric IDเป็น String Name
154. Error after replacing inventory
Slot/Weight/Count Data Modelอาจเปลี่ยน
155. Error after framework conversion
ยิ่งมี Type Mappingจำนวนมาก
ควรใช้ Conversion Migrationที่ออกแบบมา
156. Rename Columnไม่แก้ Type Mapping
ต้อง Convert Dataด้วยเมื่อจำเป็น
157. Legacy Dataมี Stringใน Numeric Fieldได้ไหม
ถ้า Schemaเก่าเคยเป็น VARCHARแล้วถูกเปลี่ยนเป็น INT:
Migrationอาจเจอ Invalid Strings
158. ต้อง Clean Dataก่อน Type Change
เช่นหา Rowsที่ไม่สามารถ Convertเป็น Integer
159. อย่า ALTER VARCHAR→INTทันทีบน Production
โดยไม่ตรวจข้อมูลเดิม
160. Example
มี:
grade = 'boss'
grade = 'member'
ใน VARCHAR
เปลี่ยนเป็น INTตรง ๆ ไม่ได้โดยไม่กำหนด Mapping
161. Mappingต้องมี Business Meaning
เช่น:
member → 0
boss → 4
เป็นเพียงตัวอย่างแนวคิด ไม่ใช่ Universal Grade Mapping
162. Migrationต้องใช้ Mappingของ Frameworkจริง
163. Errorเฉพาะ Old Character
น่าสงสัย Legacy Value
164. Errorทุก Character
น่าสงสัย Code/Schemaระดับระบบ
165. Errorเฉพาะ Characterใหม่
น่าสงสัย New Creation Payload
166. Errorตอน Login
Resourceอาจ Update Numeric Fieldด้วย String
167. Errorตอน Logout
Save Stateอาจแปลง Dataผิด Type
168. Errorตอน Garage Save
Vehicle Stateอาจเป็น:
stored
Stringแทน Numeric State
169. Errorตอน Impound
Status Mappingอาจผิด
170. Errorตอน Business Hire
Job Gradeอาจมาจาก UIเป็น Label
171. Errorตอน Promote
เป็น Caseที่พบบ่อยสำหรับ Grade Mapping
172. Errorตอน Banking
Amountอาจเป็น Display String
173. Errorตอน Invoice
Staffกรอก Amountด้วย:
1,000
แล้ว Backendไม่ได้ Normalize
174. Errorตอน Item Purchase
Quantityอาจเป็น Empty String
175. Errorตอน Crafting
Recipe AmountหรือQuantityอาจถูกอ่านจาก Configเป็น Stringที่ไม่ถูกต้อง
176. Errorตอน Mining/Farming
Reward Count Configอาจเป็น:
"1-3"
แต่ Codeพยายาม Save Stringนี้ตรงใน INT
177. Range Definitionไม่ใช่ Actual Reward
ต้อง Generate Numberก่อน Save
178. Error Cooldown
Cooldown Config:
"5 minutes"
แต่ DB Columnต้อง Seconds
179. Serverควร Convert
ตาม Resource Designก่อน Insert
180. Error Duration
Ban Resourceอาจรับ:
permanent
เข้า Numeric expires field
ถ้า Permanent Banใช้ Representationอื่น ต้อง Handleแยก
181. อย่าแปลง permanentเป็น 0เอง
บาง Systemsอาจตีความ 0ต่างกัน
182. ตรวจ Ban Resource Design
183. SQL Modeเกี่ยวอย่างไร
MariaDBระบุว่าเมื่อ Strict Modeทำงาน ค่าที่ไม่ถูกต้องหรืออยู่นอก Rangeในหลาย Numeric Contextสามารถถูก Rejectด้วย Error แทนการถูกปรับแล้วออก Warning; หากไม่ Strict พฤติกรรมบางกรณีอาจถูกปรับพร้อม Warning.
184. ควรปิด Strict Modeไหม
ไม่ควรเป็น Fixแรก
185. เพราะอะไร
ถ้า Resourceส่ง:
grade = 'boss'
เข้า Integer
การทำให้ Databaseยอมบางรูปแบบไม่ได้ทำให้ Grade Mappingถูก
186. Errorกำลังช่วยจับ Data Bug
Strict Validationมีประโยชน์ต่อ Data Integrity
187. MariaDB Non-strict Behavior
MariaDB documentationอธิบายว่าเมื่อไม่ได้ใช้ Strict Mode ระบบอาจปรับค่าที่ไม่ถูกต้องบางประเภทและส่ง Warningแทน Error.
188. นี่อาจอันตราย FiveM
เพราะ Resourceอาจคิดว่าบันทึกข้อมูลถูกแล้ว
189. ตัวอย่าง
grade = invalid string
ถูกเปลี่ยนเป็นค่าตัวเลขบางอย่าง
Characterอาจได้รับ Gradeผิด
190. Economyก็เช่นกัน
Amountผิดแต่ถูก Coerceอาจทำ Transactionผิด
191. จึงควรแก้ Value
ไม่ใช่ลด Validation
192. ตรวจ SQL Modeอย่างไร
สามารถดูค่า:
SELECT @@sql_mode;
MariaDBใช้ sql_modeในการกำหนดพฤติกรรม SQLหลายส่วน รวมถึง Strict Modes.
193. อย่าเปลี่ยน Global SQL Modeสำหรับ Resourceเดียวแบบสุ่ม
อาจกระทบ Applications/Databasesอื่น
194. Error after hosting move
Hostingใหม่อาจมี SQL Modeต่าง
Resourceที่เคยถูก Databaseเก่าปรับค่าผิดเงียบ ๆ อาจเริ่ม Error
195. นี่ไม่แปลว่า Serverใหม่เสีย
อาจเปิดเผย Bugเดิมที่ไม่เคยเห็น
196. Fix Root Causeดีกว่า
ทำ Data Typeให้ตรง
197. วิธีตรวจ Actual Value
หา Errorเช่น:
Incorrect integer value: 'abc'
for column 'grade'
abcคือเบาะแสสำคัญมาก
198. ถ้า Actual Valueเป็นชื่อของ Fieldอื่น
สงสัย Parameter Order
199. ตัวอย่าง
Error:
Incorrect integer value: 'mechanic'
for column 'grade'
มีโอกาสว่า Job Nameถูกส่งเข้า Grade
200. ถ้า Valueเป็น Empty String
สงสัย:
Inputว่าง
Configว่าง
Missing data fallback
201. ถ้า Valueเป็น undefined
สงสัย JavaScript Variable/Property
202. ถ้า Valueเป็น nil/NULL
อาจเกิด Error1048แทน ขึ้นกับ Query/Driver/Schema
203. ถ้า Valueเป็น true/false
ตรวจ Boolean Mapping
204. ถ้า Valueเป็น 1,000
ตรวจ Display Formatting
205. ถ้า Valueเป็น 10.5
ถามว่า Columnควรเป็น Integerจริงไหม
206. ถ้า Valueเป็นเลขใหญ่มาก
ตรวจ Rangeและ Unit
207. Debug Checklist
Copy Errorเต็ม
หา Table/Column
ดู Value
ดู Data Type
หา Query
หา Parameter
ดู Variable Source
ตรวจ Resource Version
ตรวจ Migration
Testใหม่
208. ตรวจ Schema
ใช้:
DESCRIBE your_table;
209. หรือ:
SHOW CREATE TABLE your_table;
210. ตรวจ Column Type
เช่น:
grade INT
211. เทียบ Official Schema
ถ้า Official SQLบอก:
grade VARCHAR(...)
แต่ Productionเป็น INT:
Schemaไม่ตรง
212. ถ้า Official Schemaก็เป็น INT
แต่ Codeส่ง String:
Code/Mapping Problem
213. วิธีนี้แยก Root Causeได้เร็ว
214. Errorจาก SQL Seed
เปิด SQL Fileที่ Insertข้อมูล
215. ตัวอย่างผิด
INSERT INTO job_grades
(job_name, grade)
VALUES ('police', 'boss');
ถ้า gradeเป็น Integer
216. Queryควรใช้ Grade Numberตาม Frameworkจริง
และ Label/Nameควรอยู่ Columnอื่นที่ออกแบบไว้
217. อย่าเปลี่ยน Columnเป็น VARCHARเพราะ Seedหนึ่ง Rowผิด
218. Errorจาก Custom Config
ใช้ Config Documentationเป็น Sourceหลัก
219. Errorจาก Copy Configของ Serverอื่น
Grade/State Valuesอาจไม่เหมือนกัน
220. FiveM Resourcesไม่ใช้ Database Schemaมาตรฐานเดียวทั้งหมด
นี่คือเหตุผลที่ไม่ควร Copy Fixแบบสากล
221. Errorจาก Database Migration
ถ้าจะเปลี่ยน String Statesเป็น Numeric States:
ต้อง Convert Existing Dataตาม Mappingก่อน
222. Backupก่อน Data Migration
จำเป็น
223. อย่า UPDATEทั้ง Tableแบบสุ่ม
เช่น:
UPDATE vehicles SET state = 0;
อาจเปลี่ยนรถทุกคันเป็น Stateเดียว
224. ใช้ SELECTก่อน
ตรวจ Rowsที่ผิด
225. Example Diagnostic
SELECT state
FROM vehicles;
หรือ Queryที่เหมาะกับ Tableจริง
226. อย่าคัดลอก Tableชื่อจากบทความโดยตรง
Serverแต่ละตัวอาจใช้ชื่อไม่เหมือนกัน
227. Existing Invalid Dataอาจต้อง Mapping
เช่น:
stored
out
impounded
ไป Numeric States
แต่เลขจริงต้องดู Resource
228. ไม่ควรเดา Mapping
เพราะ Garage Scriptแต่ละตัวใช้ต่างกันได้
229. Error after changing garage scripts
นี่คือ Caseที่ต้อง Migration Dataจริง
230. Error after switching inventories
Weight/Slot/Amount Data Modelอาจต่าง
231. Error after switching phone scripts
Status/Read Flagsอาจใช้ IntegerหรือStringต่างกัน
232. Error after changing billing
Invoice Statusอาจเปลี่ยน Type
233. Error after changing banking
Transaction Typeอาจใช้ Numeric Codeใน Resourceหนึ่งและStringในอีกตัว
234. Error after changing housing
Property Stateอาจเช่นเดียวกัน
235. Resource Replacementควรอ่าน Conversion Guide
อย่าเพียง Import SQLใหม่ทับ Tablesเก่า
236. Data Migrationควรมี Backup
และ Testบน Copyก่อน Production
237. Error 1366กับ ENUM
MariaDB ENUMมีชุด Valuesที่กำหนดไว้ และ Strict SQL Modeสามารถทำให้การ Insertค่าที่ไม่อยู่ในชุดเกิด Errorแทนใส่ special empty value.
238. ถ้า Errorข้อความไม่ใช่ Integer
ตรวจว่า Columnอาจเป็น ENUM/String Typeอื่น
239. อย่าใช้วิธี Integerกับ ENUMโดยอัตโนมัติ
อ่านข้อความ Errorให้ครบ
240. Error 1366กับ Stored Functions
MariaDB documentationยังระบุว่า Strict Modeสามารถก่อ Error 1366ได้เมื่อ Stored Functionคืนค่าที่ไม่ตรงกับ Return Typeที่กำหนด.
241. FiveMทั่วไปใช้ Stored Functionsไหม
ไม่จำเป็น
ดังนั้นให้ตรวจ Resource Query/Dataก่อน เว้นแต่ Databaseมี Custom Procedures/Functions
242. Errorนี้ทำ Server Crashไหม
Queryที่ Errorจะ Fail
Resourceจะ Crashหรือไม่ขึ้นกับ Error Handling
243. Character Saveอาจ Fail
ถ้า Queryมี Numeric Fieldผิด
244. Garage Saveอาจ Fail
Vehicle Stateไม่ถูก Save
245. Transactionอาจ Fail
Amountผิด Type
246. Item Saveอาจ Fail
Quantityผิด Type
247. ต้องดู Gameplay Impact
Errorใน Optional Logไม่เท่ากับ Errorใน Banking Balance
248. ถ้า Core Save Error
ควรแก้ก่อนปล่อย Serverเล่นต่อเต็มรูปแบบ
249. Error Spamทุก Tick
อาจทำ Logsโตและกลบ Errorอื่น
250. หา Resourceต้นทาง
อย่า Disable Database Bridgeทั้ง Serverเพราะ Resourceเดียวผิด
251. Error Handlingสำหรับ Developer
ก่อน Query:
Validate Type
Validate Range
Validate Required Values
252. ใช้ Integer Check
ถ้า Business Logicต้อง Integerจริง
253. JavaScript
แนวคิดคือ:
Parse
Validate
Reject invalid
ไม่ใช่ parseแล้วใช้ทันที
254. Lua
ใช้ tonumberแล้วตรวจ Return Value
255. Don't Trust Client
ค่าจาก NUI/Clientควรถูกตรวจซ้ำบน Server
256. Numeric Rangeสำคัญ
แม้ค่าเป็น Integer:
999999999
อาจไม่เหมาะกับ Gameplay
257. Database RangeกับGameplay Rangeต่างกัน
INTอาจรับได้
แต่ Server Economyอาจอนุญาตสูงสุดน้อยกว่านั้น
258. Server Validationต้องเข้มกว่า Databaseได้
และควรเป็นแบบนั้นในหลายกรณี
259. Error 1366 FAQ
FiveM Incorrect integer value คืออะไร
หมายถึง Resourceส่งค่าที่ MariaDBไม่สามารถใช้เป็น Integerสำหรับ Columnนั้นได้อย่างถูกต้อง โดย Error Familyที่เกี่ยวข้องคือ Error 1366 ER_TRUNCATED_WRONG_VALUE_FOR_FIELD.
Incorrect integer value: '' คืออะไร
Resourceส่ง Empty Stringเข้า Numeric Column
Empty Stringคือ 0ไหม
ไม่ใช่
ควรแก้ Resourceให้ส่ง Numeric Valueที่ถูกต้องหรือไม่ส่ง Operationนั้นถ้าข้อมูลไม่ครบ
เปลี่ยน INTเป็นVARCHARได้ไหม
ทำได้ทาง Schema แต่ไม่ควรทำเพียงเพื่อ Errorหาย ต้องตรวจว่า Fieldควรเป็น Stringจริงตาม Official Resource Schemaหรือไม่
ปิด Strict Modeช่วยไหม
อาจเปลี่ยน invalid numeric inputบางประเภทจาก Errorเป็น Warning/Adjusted Value แต่ไม่ควรเป็น Fixหลัก เพราะอาจซ่อนข้อมูลผิด.
Error grade แก้อย่างไร
ตรวจว่า Resourceส่ง Numeric Gradeหรือส่ง Job Grade Label/Nameผิด Field
Error state แก้อย่างไร
ตรวจ State Mappingของ Resourceที่ใช้อยู่จริง
Error stored แก้อย่างไร
ตรวจ Boolean/Numeric Mapping เช่น Resourceคาด 0/1หรือ Schemaอื่น
Error amount แก้อย่างไร
ตรวจ Input, Currency Formattingและ Server Validation
Error quantity แก้อย่างไร
ตรวจว่า Inputเป็น Integerและอยู่ใน Rangeที่ Resourceอนุญาต
Error slot แก้อย่างไร
ตรวจ Inventory Slot Mapping
Error weight แก้อย่างไร
ตรวจ Inventory Schemaว่าใช้ Integerหรือ Decimalและ Unitใด
Errorหลัง Update Resourceทำอย่างไร
ตรวจ Migrationและ Official Schema
Errorหลัง Framework Updateทำอย่างไร
ตรวจ Player Data/Job Object Mappingและ Framework Bridge
Errorหลังเปลี่ยน Garage Scriptทำอย่างไร
ตรวจ Vehicle State Columnและ Migration เพราะ Garage Scriptsอาจใช้ State Representationต่างกัน
Errorหลัง Restore Backupทำอย่างไร
ตรวจว่า Backup Schemaตรงกับ Code Versionปัจจุบันหรือไม่
Errorเฉพาะ Characterเก่าทำอย่างไร
ตรวจ Legacy Dataที่อาจยังใช้ String States/Valuesจาก Versionเก่า
Errorทุก Characterทำอย่างไร
ตรวจ Code, Configและ Schemaระดับระบบ
Errorเฉพาะ Jobหนึ่ง
ตรวจ Job Config/Seed Dataของ Jobนั้น
Errorเฉพาะ Itemหนึ่ง
ตรวจ Item Configเช่น Weight/Amount
Errorตอนซื้อรถ
ตรวจ Price, Vehicle Stateและ Garage Mapping
Errorตอน Banking
ตรวจ Amount Inputว่าไม่มี Comma, Currency Symbolหรือ Stringที่ไม่ใช่ตัวเลข
1,000 ใช้เข้า INTได้ไหม
ไม่ควรส่ง Display-formatted Stringเข้า Numeric Field ให้ Normalizeเป็น Numeric Valueก่อน
true/false เข้า INTได้ไหม
ควร Mappingอย่างชัดเจนตาม Resource Design ไม่ควรพึ่ง Conversionโดยไม่รู้ Behavior
undefined เข้า INTได้ไหม
ไม่ควร ต้องแก้ Variable/Propertyที่หาย
NaN เข้า Databaseได้ไหม
ไม่ควรส่ง ต้อง Validate Conversionก่อน Query
INTเต็มทำอย่างไร
ตรวจก่อนว่าค่าควรใหญ่จริงหรือเกิด Bug; MariaDB INTมี Rangeและ Strict Modeสามารถ Rejectค่าที่ Out-of-rangeได้.
เปลี่ยน INTเป็นBIGINTดีไหม
เมื่อ Official Schema/Requirementต้องรองรับค่าที่ใหญ่กว่า ไม่ควรทำเพื่อซ่อนค่าผิดปกติ; BIGINTมี Rangeกว้างกว่า INT.
Clear FiveM Cacheช่วยไหม
โดยทั่วไปไม่ใช่ Fixของ Server-side Database Type Error
Restart MariaDBช่วยไหม
ไม่ ถ้า Resourceยังส่ง Valueผิดเหมือนเดิม
Reinstall Databaseช่วยไหม
ไม่ควรทำ Errorนี้มักแก้ได้ที่ Resource Data Mapping, Configurationหรือ Schema
ต้อง Backupไหม
ควร Backupก่อน ALTER Schemaหรือ Bulk Data Conversionบน Production
สรุป FiveM MySQL Incorrect Integer Value Error 1366
FiveM MySQL/MariaDB Error 1366 Incorrect integer value มักเกิดเมื่อ Resource ส่งค่าที่ไม่เหมาะกับ Numeric Column เช่น Empty String, Text, Label, Boolean String หรือค่าจาก Variable ที่ Mapping ผิด โดย MariaDBจัด Error 1366ไว้ใน ER_TRUNCATED_WRONG_VALUE_FOR_FIELD.
เมื่อเจอ Error ลักษณะนี้ให้ตรวจตามลำดับ:
Error 1366
↓
Column ไหน?
↓
Actual Value อะไร?
↓
Column Type เป็นอะไร?
↓
Query/Parameter ไหนส่งค่านี้?
↓
Variable มาจากไหน?
↓
Code หรือ Schema ต่าง Version หรือไม่?
↓
แก้ Root Cause
สิ่งที่ comsiam แนะนำคืออย่ารีบเปลี่ยน INT เป็น VARCHAR หรือปิด Strict Modeเพียงเพื่อให้ Errorหาย เพราะ Fieldประเภท Job Grade, Vehicle State, Quantity, Slot, Price หรือ Amountอาจจำเป็นต้องเป็น Numberจริง ถ้า Resourceส่งคำว่า police, boss, undefined, false หรือ Empty Stringเข้ามา สิ่งที่ควรแก้คือ Mappingและ Validationก่อน Query ไม่ใช่ลดกฎของ Database
อีกหลักที่ comsiam แนะนำคือถ้า Errorเริ่มหลังเปลี่ยน Framework, Garage, Inventory, Phone หรือ Resourceอื่น ให้เปรียบเทียบ Official Schema + Production Schema + Actual Value ก่อนใช้ ALTER TABLE เพราะ Resourceสองตัวสามารถใช้ Fieldที่ชื่อคล้ายกันแต่เก็บข้อมูลคนละ Typeได้ การทำให้ Code, Config, Data Type และ Migrationตรง Versionกันจะเป็น Fixที่ยั่งยืนที่สุด
Comments
Post a Comment