varchar超长问题

sql_mode 一般是检查数据是否符合要求,如果设置了在不符合时会报错,不设置就会打印warning而不报错,但是数据会被截断插入。如:

mysql> select version();
+--------------------+
| version()          |
+--------------------+
| 5.7.25-TiDB-v5.4.0 |
+--------------------+
1 row in set (0.00 sec)
mysql> show variables like '%sql_mode%';
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value                                                                                                                                     |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| sql_mode      | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> create table a (name varchar(3));
Query OK, 0 rows affected (0.07 sec)
mysql> insert into a (name) values ('1234');
ERROR 1406 (22001): Data too long for column 'name' at row 1
mysql>
mysql> insert into a (name) values ('123');
Query OK, 1 row affected (0.01 sec)

mysql> set sql_mode="";
Query OK, 0 rows affected (0.00 sec)
mysql> insert into a (name) values ('1234');
Query OK, 1 row affected, 1 warning (0.01 sec)
mysql> show warnings;
+---------+------+----------------------------------------+
| Level   | Code | Message                                |
+---------+------+----------------------------------------+
| Warning | 1406 | Data Too Long, field len 3, data len 4 |
+---------+------+----------------------------------------+
1 row in set (0.00 sec)

mysql> select * from a ;
+------+
| name |
+------+
| 123  |
| 123  |
+------+
2 rows in set (0.00 sec)

和sql_mode没关系。

而且常规的通过tidb-server的访问,我这边验证是正常的,没能复现楼主说的现象。