我有关于MySQL的下表。我使用的是5.6.32。该表包含大约约4,000万条记录。我只是分享了我觉得有必要理解这个问题的专栏。
表格结构
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)的新列。但是,当我做长度(new_column)时,有些条目超过255个字符。
插入的实际值:
随机* GS02,355234054262743,GPS:356728; A; N33.614073; E77.063096; 0; 0; 230118,STT:400; 0,ADC:0&安培; RRR * 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和两个Slaves上的变量都设置为
+--------------------------+----------------------------+
| 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本机复制允许将更多字符写入列?为什么Tungsten replicator会阻止它?