我在 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 本机复制允许将更多字符写入列?为什么钨复制器会阻止它?