Open
Description
- 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.
- setup a MySQL server with Binary Log Format=ROW format
- update a row with a negative number (-4444)
- 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
Labels
No labels