首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 刪除含特殊字符表名 (如 IP 地址) 的避坑指南:反引號與 Shell 轉義

     編輯:MySQL 綜合教學

場景

數據庫有 8 萬+ 表,大量以 IP 命名 (如 192.168.1.30),需批量清理。

踩坑過程

1. 導出表名

mysql -uroot -p123456 -A -e "use cdn;show tables;" > allDBName.txt
cat allDBName.txt | grep "^[0-9]\{1,3\}\.[0-9]\{1,3\}\." > ipDB.txt

2. 初版腳本 (直接變量)

#!/bin/bash
cat ipDB.txt | while read DBname; do
  mysql -uroot -p123456 -A -e "use cdn;DROP TABLE IF EXISTS $DBname;" 2>>drop.err
  if [ $? -ne 0 ]; then echo "Drop $DBname failed"; fi
done

報錯: ERROR 1064: syntax error near ''192.168.1.30''

3. 原因分析

表名包含 點號,MySQL 視為 database.table 語法,必須用 反引號 包裹:\`192.168.1.30\`。

4. 二版腳本 (單引號包裹 SQL,反引號轉義失敗)

mysql -uroot -p123456 -A -e 'use cdn;DROP TABLE IF EXISTS `$DBname`;'

報錯: command not found — Shell 在單引號內不展開變量 $DBname。

5. 三版腳本 (雙引號 + 反引號轉義) ✅

#!/bin/bash
cat ipDB.txt | while read DBname; do
  mysql -uroot -p123456 -A -e "use cdn;DROP TABLE IF EXISTS \`$DBname\`;" 2>>drop.err
  if [ $? -ne 0 ]; then echo "Drop $DBname failed"; fi
done
exit 0
  • "... 雙引號允許變量展開
  • \` 反引號在雙引號中需用反斜杠轉義 \`
  • 生成 SQL:DROP TABLE IF EXISTS \`192.168.1.30\`; — 正確

關鍵知識點總結

通用模板:批量 DDL 安全執行

#!/bin/bash
set -euo pipefail
TABLE_LIST="ipDB.txt"
DB="cdn"
USER="root"
PASS="123456"
ERR_LOG="drop.err"

while IFS= read -r tbl; do
  [[ -z "$tbl" ]] && continue
  mysql -u"$USER" -p"$PASS" -A -e "USE \`$DB\`; DROP TABLE IF EXISTS \`$tbl\`;" 2>>"$ERR_LOG"
  if [[ $? -ne 0 ]]; then
    echo "[$(date)] FAIL: $tbl" | tee -a "$ERR_LOG"
  else
    echo "[$(date)] OK: $tbl"
  fi
done < "$TABLE_LIST"

延伸:其他特殊字符表名

  • 空格:\`my table\`
  • 保留字:\`order\`, \`group\`, \`select\`
  • 中文/Emoji:\`用戶表\` (需字符集支援 utf8mb4)
  • 連字符:\`my-table\`

統一規範:所有標識符一律反引號包裹,ORM/遷移工具自動處理。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
場景正確寫法說明
SQL 中表名含特殊字符\`table.name\`反引號包裹標識符
Shell 雙引號中輸出反引號\`反斜杠轉義
Shell 單引號中變量不展開需用雙引號
MySQL 命令行 -e 參數雙引號包裹整條 SQL內部反引號需轉義