Skip to content

Negative Numbers are converted to huge numbers #108

Open
@qrizly2

Description

@qrizly2
  • Operating System: Linux
  • PHP Version: 8.1.2
  • php-mysql-replication Version: v7.0.1
  • *mysql version (SELECT VERSION();): 5.7.36-log

Steps required to reproduce the problem.

  1. setup a MySQL server with Binary Log Format=ROW format
  2. update a row with a negative number (-4444)
  3. Listen with a subscriber for an update event

Expected Result.

  • Number is a negative number (-4444)

Actual Result.

  • Huge positive number (4294962852)

I already have this snippet in place to fix the values, but what should be the preferred way of doing this correctly?

    protected function fixSignedNumbers(RowsDTO $event, array $values): array
    {
        /**  @var \MySQLReplication\Event\RowEvent\ColumnDTO $column */
        foreach ($event->getTableMap()->getColumnDTOCollection() as $column) {
            if(
                isset($values[ $column->getName() ]) &&
                is_int($values[ $column->getName() ]) &&
                ! $column->isUnsigned()
            ) {
                list($type) = explode("(", $column->getFieldDTO()->getColumnType());

                switch ($type) {
                    case 'int':
                        if($values[ $column->getName() ] > 2147483647) {
                            $values[ $column->getName() ] = $values[ $column->getName() ] - 2147483647 - 2147483647 - 2;
                        }
                        break;
                    case 'mediumint':
                        if($values[ $column->getName() ] > 8388607) {
                            $values[ $column->getName() ] = $values[ $column->getName() ] - 8388607 - 8388607 - 2;
                        }
                        break;
                    case 'smallint':
                        if($values[ $column->getName() ] > 32767) {
                            $values[ $column->getName() ] = $values[ $column->getName() ] - 32767 - 32767 - 2;
                        }
                        break;
                    case 'tinyint':
                        if($values[ $column->getName() ] > 127) {
                            $values[ $column->getName() ] = $values[ $column->getName() ] - 127 - 127 - 2;
                        }
                        break;
                }
            }
        }

        return $values;
    }

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions