对 VARCHAR 修改强制截断?

Force Truncation on VARCHAR modification?

我想在一些列上将 VARCHAR 限制为 255,以便我可以添加索引。

alter table striker modify contacts varchar(255)

当我尝试运行上述命令时,我得到

Error Code: 1265. Data truncated for column 'contacts' at row 331   38.969 sec

有没有办法强制截断列,以便此命令成功缩短 VARCHAR?我不关心缩短列中的数据。

您可以手动将列截断为 255 个字符:

UPDATE striker
SET    contacts = SUBSTR (contacts, 1, 255);

现在,您知道没有任何值超过 255 个字符,您可以安全地执行 OP 中的 alter table 语句。

为什么要截断该列?只需为列创建带有长度说明符的索引。这是一个例子:

create index idx_striker_contacts on striker(contacts(255))

您可以对多列执行此操作。

聚会迟到了,尽管我在 2022 年带着这个问题来到这里,但没有找到令人满意的解决方案。假设您正在本地制作原型,正如问题所暗示的那样,因为这些查询可能一如既往地对您的数据产生深远影响 - 请谨慎使用。有意简化和直接:这应该有效,假设您使用 root 权限登录 - 在接近生产的任何情况下很少会出现这种情况,对吧。这家伙暂时把严格模式等放在一边:

SET @tempsql_mode= @@global.sql_mode;
SET @@global.sql_mode= '';
alter table striker modify contacts varchar(255);
SET @@global.sql_mode= @tempsql_mode;