← 返回错误码列表

MySQL错误码 1264 分析与解决方案

错误信息

Error 1264

超出范围值调整到列类型的最大值。

你的PHP应用在使用PDO连接MySQL时遇到了数值范围错误:

'pdo_code' => '22003',
'db_code' => 1264,
'db_error' => 'Out of range value for column'

解决方案

  • 检查并修正超出范围的数据值
  • 修改表结构,扩大列的数据类型范围
  • 在应用层进行数据验证和范围检查
  • 使用合适的MySQL数据类型
  • 检查UNSIGNED属性的使用
  • 处理NULL值的插入情况

PHP数据验证示例代码

// 插入数据前的验证函数
function validateColumnRange($value, $columnType, $columnName) {
  switch ($columnType) {
    case 'TINYINT':
      $min = -128;
      $max = 127;
      break;
    case 'TINYINT UNSIGNED':
      $min = 0;
      $max = 255;
      break;
    case 'INT':
      $min = -2147483648;
      $max = 2147483647;
      break;
    case 'INT UNSIGNED':
      $min = 0;
      $max = 4294967295;
      break;
    default:
      return true; // 未知类型,跳过验证
  }

  if ($value < $min || $value > $max) {
    throw new InvalidArgumentException(
      "列 '{$columnName}' 的值 {$value} 超出范围 [{$min}, {$max}]"
    );
  }
  return true;
}

// 使用示例
try {
  $age = 300;
  validateColumnRange($age, 'TINYINT UNSIGNED', 'age');
  
  // 验证通过,执行插入操作
  $stmt = $pdo->prepare("INSERT INTO users (age) VALUES (?)");
  $stmt->execute([$age]);
  
} catch (InvalidArgumentException $e) {
  // 处理验证错误
  error_log($e->getMessage());
  // 返回错误信息给用户
}

数值范围错误示例

常见的数据类型范围限制:

TINYINT 范围错误

尝试插入值: 300

数据类型: TINYINT UNSIGNED

允许范围: 0 到 255

结果: 错误 1264

INT 范围错误

尝试插入值: 5000000000

数据类型: INT UNSIGNED

允许范围: 0 到 4294967295

结果: 错误 1264

解决方案

1. 修改为更大的数据类型

2. 在应用层验证数据范围

3. 使用合适的数据类型设计

预防措施

1. 数据库设计优化

  • 选择合适的数据类型和大小
  • 正确使用UNSIGNED属性
  • 考虑未来数据增长需求
  • 设置合理的默认值和NULL约束

2. 应用层验证

  • 在插入前验证数据范围
  • 使用表单验证规则
  • 实现数据清洗和转换
  • 添加适当的错误处理

3. 数据类型参考

  • TINYINT: -128 到 127
  • TINYINT UNSIGNED: 0 到 255
  • INT: -2³¹ 到 2³¹-1
  • INT UNSIGNED: 0 到 2³²-1
  • BIGINT: -2⁶³ 到 2⁶³-1
  • BIGINT UNSIGNED: 0 到 2⁶⁴-1

调试工具

使用以下MySQL命令检查表结构:

# 查看表结构
DESCRIBE table_name;

# 查看详细的列信息
SHOW COLUMNS FROM table_name;

# 查看创建表的SQL语句
SHOW CREATE TABLE table_name;

调试要点

检查以下信息:

  • 列的数据类型和范围限制
  • UNSIGNED属性的设置
  • 默认值和NULL约束
  • 实际插入的数据值