请问tidb有参数可以让varchar精度按字符存储吗,varchar(20)存20个汉字

ddl迁过来后字符截断了

1赞

1)按精度存储?不是很明白,可以说下你的上下文信息;
2)varchar(20)就是可以存储20个汉字,这个没有异议。

哈?是不是对varchar有误解?

TiDB 中 varchar(20) 指的就是可以存储 20 个字符,无关编码和字节长度。
截断应该是其他原因导致的,深入排查一下吧。

image 默认单节点的库,odbc连的,那就是odbc有问题

v5.3.0版本正常,没有截断
image

我是v5.0.1,我换个版本试试

又试了一下v4.0.13,也是正常的。我这边没有v5.0.1的,但是感觉不会中间某个版本有问题。
image

5.7.25-TiDB-v5.1.2

mysql> create table ttttt(name varchar(3));
Query OK, 0 rows affected (0.68 sec)

mysql> insert into ttttt values('xxx');
Query OK, 1 row affected (0.10 sec)

mysql> insert into ttttt values('xxxx');
ERROR 1406 (22001): Data too long for column 'name' at row 1

mysql> insert into ttttt values('我爱你');
Query OK, 1 row affected (0.02 sec)

mysql> insert into ttttt values('我爱你1');
ERROR 1406 (22001): Data too long for column 'name' at row 1
mysql> 
mysql> 

mysql> select * from ttttt;
+-----------+
| name      |
+-----------+
| xxx       |
| 我爱你    |
+-----------+
3 rows in set (0.00 sec)

他是插入不报错,查询返回结果被截断了。

是否被截断跟严谨模式有关,如果报错的话,在非严谨模式下就应该是截断,但是按理说不会3的长度是够的,可以看下字符集和排序规则

你是说sql_mode么?

对的,他截断就是非严谨模式超长了,但是为什么截断不太清楚

截图是我这边的,我这边是没有截断。你说的非严谨模式是哪个?

看看用户是怎么连的,整个连接链路环节的字符集都设置的是否兼容呢?

你这就算严谨了,set session.sql_mode="",或者其他的不严谨的都行,就会像上面出现阶段的情况,但是截断是在超长的情况下出现的,楼主的并不超长,感觉是编码之类的问题

可以看一下字符集:https://docs.pingcap.com/zh/tidb/stable/data-type-string/#varchar-类型