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

  1. Copy Errorเต็ม

  2. หา Table/Column

  3. ดู Value

  4. ดู Data Type

  5. หา Query

  6. หา Parameter

  7. ดู Variable Source

  8. ตรวจ Resource Version

  9. ตรวจ Migration

  10. 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

Popular posts from this blog

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

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

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