04月30, 2024
收藏本站

零宽字符导致MySQL表神奇消失

很久没写文章了,今天看了篇文章《MySQL 创建表后神秘消失?揭秘零宽字符陷阱》,一开始也是被标题吸引进去。

复现

CREATE TABLE `lang​` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

# show tables;可看到表lang,但直接select查不到
select * from lang;
ERROR 1146 (42S02): Table 'test.lang' doesn't exist

原因为lang后面含有零宽字符 image.png

思考

  1. 原文中已经说了如何解决,例如复制到编辑器中可能会提示异常符号、show tables查看的时候边框线 “|” 与其他行是不对齐的。
  2. 而我的排查方式不一样,第一直觉就是觉得里面含有特殊字符,直接查hex字符。
abul test>select hex(table_name),hex('lang') from information_schema.tables where table_schema='test' and table_namelike 'lang%';
+-----------------+-------------+
| hex(table_name) | hex('lang') |
+-----------------+-------------+
| 6C616E67E2808B  | 6C616E67    |
+-----------------+-------------+
1 row in set (0.00 sec)
  1. 另外,如何避免?上线SQL正常会经过goInception审核,那如何避免RD提交类似特殊字符。可能得正则查找,暂时列个TODO。
  2. 零宽字符大多数情况不可见,那会用在什么地方?某些社交平台,敏感词汇会被脱敏,这样是否就可以反脱敏。

Comments