Я использую PHP-PDO для синхронизации таблицы SQL Server с помощью RowVersion из нашей ERP в базу данных MariaDB (хостинг).
Когда я сохраняю значения в локальной (офисной) базе данных MariaDB версии 5.5.56, все идет нормально, и данные сохраняются правильно. Когда я делаю то же самое для хранения данных на нашем хостинге с версией MariaDB 10.0.37, поле rowversion сохраняет другое значение.
Вместо этого я попытался с SQL Server скопировать данные между офисом MariaDb и удаленным MariaDb, используя PHP PDO, и у меня та же проблема. Исходное значение rowversion отличается от удаленного значения rowversion.
Для хранения поля rowversion я использую VARBINARY(8).
Пример:
ERP SQL SERVER ROW: (id, описание, rowversion). Значения: 1, AMARILLO, 0x00000000025DB362 ERP ROW
Локальная база данных MariaDb: сохраненные значения 1,AMARILLO,00000000025db362 Локальная строка MariaDb
Удаленная база данных MariaDb: сохраненные значения: 1, AMARILLO, 00000000025d3f62 удаленная строка MariaDb
Я не понимаю, почему удаленный MariaDb сохраняет другое значение. Обе таблицы mariadb идентичны, но в одной хранится одно значение, а в другой — другое. Есть идеи? может ли быть проблема с версией базы данных?
Код PHP TEST, в данном случае с локального MariaDb на удаленный MariaDb:
$sql = "SELECT * FROM colors";
$sth = $this->Db->localdb->query($sql);
$res = $sth->fetchAll(PDO::FETCH_ASSOC);
$sql = "TRUNCATE TABLE colors";
$this->Db->remotedb->exec($sql);
$sql = "INSERT INTO colors (id,des,rowversion) VALUES (?,?,?)";
$sthinsert = $this->Db->remotedb->prepare($sql);
foreach ($res as $line)
{
echo "Inserting color {$line['id']}" . PHP_EOL;
$sthinsert->execute(array(
$line['id'],$line['des'],$line['rowversion']
));
}
Стол:
CREATE TABLE `colors` (
id int NOT NULL,
des varchar(30),
rowversion varbinary(8),
date timestamp NOT NULL DEFAULT NOW() ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) ENGINE=myisam DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci COMMENT 'Colors';
ОБНОВЛЕНО И РЕШЕНО:
После прочтения этого сообщения PHP/PDO/MySQL: вставка в MEDIUMBLOB сохраняет неверные данные Я протестировал изменение SET NAMES в моей удаленной базе данных. Это решило проблему.
Я добавил эту строку в свою программу PHP:
$this->Db->remotedb->exec("SET NAMES latin1 COLLATE latin1_general_ci");
Теперь вопрос, почему база данных (MariaDB) работает так, а вторая по-другому.
Sqlserver работает с сопоставлением Modern_Spanish_CI_AS.
Локальный mariadb работает с utf8mb4_unicode_ci, и я установил в PDO utf8
Удаленный mariadb находится в utf8mb4_general_ci, и я также устанавливал PDO для utf8.
С этими сопоставлениями данные, поступающие от SqlServer, сохранялись по-разному. Установка нового сопоставления решила эту проблему. Было бы лучше, если бы PDO мог использовать двоичные данные без какой-либо интерпретации, связанной с сопоставлением.
ВТОРОЕ ОБНОВЛЕНИЕ
Я нашел лучший способ сделать это:
Я создаю таблицу с CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
Я меняю CHARSET в PDO на:
$this->Db->remotedb->exec("SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci");
При этом символы версии строки и языка сохраняются правильно.
Ваше здоровье.