tidb字符集和排序问题

【TiDB 使用环境】测试
【TiDB 版本】v8.5.1
【操作系统】
【部署方式】云上部署(什么云)/机器部署(什么机器配置、什么硬盘)
【集群数据量】
【集群节点数】
【问题复现路径】做过哪些操作出现的问题

字符集和排序规则怎么修改。
为什么设置了之后set global collation_server=‘utf8_general_ci’;
还是使用utf8_bin排序

【遇到的问题:问题现象及影响】
【资源配置】进入到 TiDB Dashboard -集群信息 (Cluster Info) -主机(Hosts) 截图此页面
【复制黏贴 ERROR 报错的日志】
【其他附件:截图/日志/监控】

不能凭感觉猜测参数的作用,要查看文档哦,这个参数控制的是创建数据库的默认字符集,参考:https://docs.pingcap.com/zh/tidb/stable/system-variables/#collation_server

1 个赞

MySQL utf8 默认的排序规则是 utf8_general_ci, 为什么TiDB是 utf8_bin, 这个地方兼容性有问题那

1 个赞

貌似也没找到修改的地方, 只有个default_collation_for_utf8mb4 能修改utf8mb4的

1 个赞

哈哈,实在是找不到utf8的默认排序规则在哪设置了。

设置下 collation_database试试

库本身不重要,排序从database 到表到列都有设置,设置到合适地方就行

问题在于迁移, mysql 几万张表迁移到tidb,要一张一张改

建表语句里面没有排序规则吗,正常应该带的,比如show create table 就会带啊,迁移过来你应该也不用改排序规则

MySQL里面utf8_general_ci 是默认排序规则, show create table 是不会展示的。 迁移工具拿到的建表语句就没有排序规则

那是迁移工具问题不是mysql问题,mysql正常获取建表语句使用show create table是带完整的字符集排序信息的

你可以测试一下, 我已经测试了很多遍了, 导出工具用dumpling也是一样的结果

你用navicat导出表结构把

应该是创建的时候是什么,show create table的时候就是什么

CREATE TABLE `t2025032501` (
  `id` int(11) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `c_int` int(11) NOT NULL,
  `c_varchar` varchar(20) NOT NULL,
  `c_int2` int(11) NOT NULL,
  `c_varchar2` varchar(20) NOT NULL,
  `c_int1` int(11) DEFAULT NULL,
  `sfsfsdfsd` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,
  KEY `indx_1` (`c_int1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

SHOW CREATE TABLE t2025032501;
结果:
CREATE TABLE `t2025032501` (
  `id` int(11) NOT NULL,
  `name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
  `c_int` int(11) NOT NULL,
  `c_varchar` varchar(20) COLLATE utf8mb4_general_ci NOT NULL,
  `c_int2` int(11) NOT NULL,
  `c_varchar2` varchar(20) COLLATE utf8mb4_general_ci NOT NULL,
  `c_int1` int(11) DEFAULT NULL,
  `sfsfsdfsd` varchar(10) COLLATE utf8mb4_general_ci DEFAULT NULL,
  PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,
  KEY `indx_1` (`c_int1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci

你 MySQL哪个版本 5.7还是8.0

8.0的。

这是变量。大概率就是客户端的问题。


8.0 是都会显示, 你试一下5.7

改成非默认的 utf8mb4_bin 就会显示