tiflash 真的不支持 gbk 字符集的表么,还是只是。。。

【 TiDB 使用环境】Poc
【 TiDB 版本】v7.2.0
【复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】
【资源配置】
【附件:截图/日志/监控】


reproduce test case:

  • 先创建表,复制到 tiflash ,再增加 varchar 列, 可以通过 tikv/tiflash 正常查询。
create table tgbk (id int) charset = gbk;
create table tascii (id int) charset = ascii;
create table tbinary (id int) charset = binary;
create table tlatin1 (id int) charset = latin1;
create table tutf8mb4 (id int) charset = utf8mb4;
create table tutf8 (id int) charset = utf8;
create table t (id int);

alter table t        set tiflash replica 1;
alter table tascii   set tiflash replica 1;
alter table tbinary  set tiflash replica 1;
alter table tgbk     set tiflash replica 1;
alter table tlatin1  set tiflash replica 1;
alter table tutf8    set tiflash replica 1;
alter table tutf8mb4 set tiflash replica 1;

alter table t        set tiflash replica 1;
alter table tascii   set tiflash replica 1;
alter table tbinary  set tiflash replica 1;
alter table tgbk     set tiflash replica 1;
alter table tlatin1  set tiflash replica 1;
alter table tutf8    set tiflash replica 1;
alter table tutf8mb4 set tiflash replica 1;

insert t        select 1;
insert tascii   select 1;
insert tbinary  select 1;
insert tgbk     select 1;
insert tlatin1  select 1;
insert tutf8    select 1;
insert tutf8mb4 select 1;

set @@session.tidb_isolation_read_engines = 'tikv';
-- set @@session.tidb_isolation_read_engines = 'tiflash';

select * from t        ;
select * from tascii   ;
select * from tbinary  ;
select * from tgbk     ;
select * from tlatin1  ;
select * from tutf8    ;
select * from tutf8mb4 ;

set @@session.tidb_isolation_read_engines = 'tikv,tiflash';

alter table t        add column c varchar(1);
alter table tascii   add column c varchar(1);
alter table tbinary  add column c varchar(1);
alter table tgbk     add column c varchar(1);
alter table tlatin1  add column c varchar(1);
alter table tutf8    add column c varchar(1);
alter table tutf8mb4 add column c varchar(1);

update t        set c = 'a';
update tascii   set c = 'a';
update tbinary  set c = 'a';
update tgbk     set c = 'a';
update tlatin1  set c = 'a';
update tutf8    set c = 'a';
update tutf8mb4 set c = 'a';
  • But, 先创建带有字符类型的表,写入数据后,再复制到 TiFlash,则只有 gbk 的表创建 TiFlash 副本失败。
create schema yandb2;
use yandb2;

create table tgbk     (id int, c varchar(10)) charset = gbk;
create table tascii   (id int, c varchar(10)) charset = ascii;
create table tbinary  (id int, c varchar(10)) charset = binary;
create table tlatin1  (id int, c varchar(10)) charset = latin1;
create table tutf8mb4 (id int, c varchar(10)) charset = utf8mb4;
create table tutf8    (id int, c varchar(10)) charset = utf8;
create table t        (id int, c varchar(10));

insert t        select 1,'b';
insert tascii   select 1,'b';
insert tbinary  select 1,'b';
insert tgbk     select 1,'b';
insert tlatin1  select 1,'b';
insert tutf8    select 1,'b';
insert tutf8mb4 select 1,'b';

alter table tascii   set tiflash replica 1;
alter table tbinary  set tiflash replica 1;
alter table tgbk     set tiflash replica 1;
alter table tlatin1  set tiflash replica 1;
alter table tutf8    set tiflash replica 1;
alter table tutf8mb4 set tiflash replica 1;

PTAL~

2 个赞

image

1 个赞

emm…
你看case1,gbk的表已经在TiFlash里了

看起来设置副本时限制不是很严格,你搞中文写入看看查询结果呢

等我试试,

其实我的困惑是这个文档里写的限制是不是针对 tidb 老版本的,之后tidb支持 gbk 之后文档就没更新,而且我也没找到 TiFlash 的代码里哪里加了限制。

我们统一用的CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci

raise a issue to record this.
https://github.com/pingcap/tiflash/issues/7880

TiDB 与 TiFlash 之间的协议是 TiDB 不允许带有 gbk 列的表建副本,所以 TiFlash 代码里并没有显式的限制。你这个例子里,先建不带 string 列的表,然后给这个表加 TiFlash 副本这个操作没报错是因为表里面确实没有 gbk 列,不过后面用 alter table add column 的时候没报错这个行为可以认为是不符合 TiDB 与 TiFlash 的约定的。另外这个限制不是针对老版本的,TiFlash 目前为止还是不支持 gbk

GBK 字符集的表是不能同步到 TiFlash 的,会报下面这个错误。

ERROR 8200 (HY000): Unsupported ALTER table replica for table contain gbk charset

也就是说,如果数据表使用了 GBK 字符集,就无法使用新特性。

目前 TiFlash 所支持的字符集有 UTF8, UTF8MB4, ASCII, Latin1, Binary 这5种。

所以,一般情况下,在创建数据表时,不建议使用 GBK 字符集。如果是迁移或重构项目,建议将数据转换为 UTF8mb4。

well, 感谢您的回答,
接下来跟踪这个case 如何处理好了。
https://github.com/pingcap/tidb/issues/46041

utf8mb4 哈拉少

另外那篇文章其实转自咱们的社区专栏哦。:stuck_out_tongue_winking_eye:

大佬,是真地

我看到了,社区专栏那篇帖子是你写的

官方说不支持

建议都统一UTF8mb4

此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。