0

我在 MySQL 上有下表。我正在使用 5.6.32。该表包含约 4000 万条记录。我只分享我认为理解问题所必需的专栏。

表结构

create table `random` (
  `id` bigint(20) not null auto_increment,
  `some_id` bigint(20) not null,
  `latitude` decimal(20,14) default null,
  `longitude` decimal(20,14) default null,
  `new_column` varchar(255) collate utf8_unicode_ci default null,
  primary key (`id`)
) engine=innodb auto_increment=40878872 default charset=utf8 collate=utf8_unicode_ci;

因此,我在此表中添加了一个名为 new_column varchar(255) 的新列。但是,当我执行 length(new_column) 时,有超过 255 个字符的条目。

插入的实际值:

随机*GS02,355234054262743,GPS:356728;A;N33.614073;E77.063096;0;0;230118,STT:400;0,ADC:0���&���������� ���r������r��������r������*GS02,39233054663793,GPS:173158;A;N33.614057;E77.0263201;0;0;210118 ,STT:200;0,ADC:0;24.7;1;29.9;2;4.2;3;0.0

在 MySQL Master(比如说,机器 #1)上,我的应用程序能够毫无问题地将这个值插入到表中的 new_column 中。我有一个使用本机 MySQL 复制的 MySQL 从属设备(例如,机器 #2),它也能够轻松复制这条记录。但是我有另一个从机器#2 使用钨复制器复制。每当有一个超过 255 个字符的字符串时,钨会抛出以下错误并且复制中断

pendingError           : Event application failed: seqno=2395306016 fragno=0 message=java.sql.SQLDataException: Data too long for column 'new_column' at row 1
pendingExceptionMessage: java.sql.SQLDataException: Data too long for column 'new_column' at row 1

编辑:

Master和两个Slave上的变量都设置为

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

创建表时的排序规则在所有实例上设置为 utf8_unicode_ci。

为什么 MySQL 本机复制允许将更多字符写入列?为什么钨复制器会阻止它?

4

0 回答 0