You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何转义表名与列名中的反引号?大SQL文件导入后对象被反引号包裹求解

解决MySQL导入后表名/列名被´包裹的问题

看起来你碰到的问题是备份文件里用了错误的标识符引号——不是MySQL默认的反引号`(ASCII 96),而是那个视觉相似的´(ASCII 180),导致MySQL把这些符号当成了表名/列名的一部分,而不是用来包裹标识符的边界。因为40GB的文件根本没法直接编辑,咱们可以用流式处理的方式,在导入的时候实时替换这些错误字符,完全不用动原文件。

实时替换字符后导入(推荐方案)

sed是一个适合处理大文件的流式文本工具,它不需要把整个文件加载到内存,而是逐行处理并输出结果。我们可以用它把所有的´替换成MySQL认可的,然后直接把处理后的数据流传给mysql`命令导入。

方式1:直接字符替换(字符显示正常时用)

执行以下命令即可:

sed 's/´/`/g' test.sql | mysql -u doadmin -p -f tetdb

提示:如果你的shell把`符号解析成了命令替换(比如bash环境下),可以改用下面的十六进制替换方式,更稳妥。

方式2:十六进制编码替换(避免编码识别问题)

如果直接字符替换遇到编码相关的问题,我们可以用字符的十六进制值来精准替换:

  • ´的十六进制编码是\xB4(对应ASCII 180)
  • 的十六进制编码是\x60`(对应ASCII 96)

命令如下:

sed 's/\xB4/\x60/g' test.sql | mysql -u doadmin -p -f tetdb

这个命令会逐行读取test.sql,替换所有错误的´为正确的`,然后直接将处理后的内容导入数据库,全程不会生成中间文件,节省磁盘空间。

关于转义表名/列名中的´

如果你的业务场景确实需要保留表名或列名中的´字符(而不是替换成),那么在MySQL中,你需要用正确的标识符引号把整个名称括起来,比如:

CREATE TABLE `test´cache´menu` (
  `id´col` INT PRIMARY KEY
);

这样MySQL就会将test´cache´menu作为完整的表名,其中的´是普通字符,不需要额外转义。不过根据你的描述,你应该是想让原来的标识符用正确的`包裹,而不是让表名带´,所以上面的替换方案更适合你的需求。

内容的提问来源于stack exchange,提问作者visabhishek

火山引擎 最新活动