你可以在MySQL中的varchar(N)中存储超过N个字符吗?

时间:2018-01-22 06:02:38

标签: mysql special-characters database-replication varchar tungsten-replicator

我有关于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会阻止它?

0 个答案:

没有答案