name: mysql-database description: "MySQL 資料庫操作技能。通過 mysql CLI 連線資料庫,執行 SELECT 查詢、INSERT/UPDATE/DELETE 增刪改、批次 SQL 執行、事務控制、資料庫/表管理、JSON 格式輸出。適用場景:查使用者資料、統計報表、資料匯入匯出、資料庫巡檢、表結構檢視、遠端連線、生產環境除錯。觸發關鍵詞:MySQL、資料庫查詢、SQL 語句執行、連線資料庫、查表、資料增刪改、jdbc 連線字串、navicat、資料庫遷移、DESCRIBE TABLE、查看錶結構、表字段分析、檢視索引、EXPLAIN 查詢分析。" license: "Copyright © 2026 少煊(年少有為,名聲煊赫)429668385@qq.com. All rights reserved."
Use the mysql CLI to connect to and interact with MySQL databases. Use the -e flag to execute SQL statements and the -s (--silent) flag to produce clean output suitable for processing. Combine with -r (--raw) to avoid escaping, and pipe the result to jq for reliable JSON formatting.
mysql -h <host> -u <user> --database <db> -s -r -e "SELECT * FROM users LIMIT 10;" 2>$null
mysql -h <host> -u <user> --database <db> -s -r -e "DESCRIBE users;" 2>$null
# 插入
mysql -h <host> -u <user> --database <db> -s -r -e "INSERT INTO users (name, email) VALUES ('Test', 'test@example.com');" 2>$null
# 更新
mysql -h <host> -u <user> --database <db> -s -r -e "UPDATE users SET status=1 WHERE id=1;" 2>$null
# 刪除
mysql -h <host> -u <user> --database <db> -s -r -e "DELETE FROM users WHERE id=1;" 2>$null
mysql -h <host> -u <user> --database <db> -s -r -e "SELECT COUNT(*) as total, SUM(amount) as revenue FROM orders WHERE DATE(create_time)=CURDATE();" | jq -s '.'
mysql -h <host> -u <user> --database <db> -s -r -e "SELECT * FROM users INTO OUTFILE '/tmp/users.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\n';" 2>$null
mysql -h <host> -u <user> --database <db> -s -r < script.sql 2>$null
mysql -h <hostname> -P <port> -u <username> --database <database-name> -s -r
示例 (連線本地資料庫):
MYSQL_PWD=yourpassword mysql -h 127.0.0.1 -u app_user --database app_db -s -r
使用者可能提供 JDBC URL 格式:jdbc:mysql://host:port/database,需要解析為 mysql CLI 引數:
jdbc:mysql://nexus.syrinxchina.com:3306/test3
→ -h nexus.syrinxchina.com -P 3306 --database test3
# 示例:從 JDBC URL 構建連線
JDBC_URL="jdbc:mysql://nexus.syrinxchina.com:3306/test3"
HOST=$(echo $JDBC_URL | sed -n 's/.*:\/\/\([^:]*\):\([0-9]*\)\/\(.*\)/\1/p')
PORT=$(echo $JDBC_URL | sed -n 's/.*:\/\/\([^:]*\):\([0-9]*\)\/\(.*\)/\2/p')
DB=$(echo $JDBC_URL | sed -n 's/.*:\/\/\([^:]*\):\([0-9]*\)\/\(.*\)/\3/p')
mysql -h "$HOST" -P "$PORT" -u root --database "$DB" -s -r
| Option | Description |
|---|---|
-h |
Hostname (default: localhost) |
-P |
Port (default: 3306) |
-u |
Username |
-p |
Prompt for password (less secure, avoid in scripts) |
-D / --database |
Default database |
-e |
Execute query and exit |
-s |
Silent mode (no headers/borders) |
-r |
Raw mode (no escaping) |
--ssl-mode=REQUIRED |
Force SSL connection |
--connect-timeout=<seconds> |
Connection timeout |
--default-character-set=utf8mb4 |
Character set |
連線示例 (完整引數):
MYSQL_PWD=password mysql -h 192.168.1.100 -P 3306 -u admin --database mydb --ssl-mode=REQUIRED --connect-timeout=10 -s -r
建立 ~/.my.cnf 簡化頻繁連線:
[client]
host = 127.0.0.1
port = 3306
user = app_user
database = app_db
password = yourpassword
ssl-mode = DISABLED
mysql --defaults-extra-file=~/.my.cnf -s -r -e "SELECT 1;"小蔥技能站7w4.net每天更新,海量AI技能等你發現。
mysql -h <host> -u <user> --database <db> -s -r -e "SELECT * FROM your_table LIMIT 5;" | jq -R -s 'split("\n") | map(select(. != "")) | map(split("\t")) | {headers: .[0], rows: .[1:]}'
更推薦的方法 (在SQL內生成JSON):
mysql -h <host> -u <user> --database <db> -s -r -e "SELECT JSON_OBJECT('id', id, 'name', name) FROM users LIMIT 5;" | jq -s '.'
輸出:
[
{"id": 1, "name": "Alice"},
{"id": 2, "name": "Bob"}
]
mysql -h <host> -u <user> --database <db> -s -r -e "INSERT INTO users (name, email) VALUES ('New User', 'new@example.com'); SELECT JSON_OBJECT('last_insert_id', LAST_INSERT_ID());" | jq .
mysql -h <host> -u <user> --database <db> -s -r -e "UPDATE users SET status = 'active' WHERE signup_date < '2026-01-01'; SELECT JSON_OBJECT('rows_affected', ROW_COUNT());" | jq .
mysql -h <host> -u <user> --database <db> -s -r -e "DELETE FROM sessions WHERE last_activity < DATE_SUB(NOW(), INTERVAL 30 DAY); SELECT JSON_OBJECT('rows_affected', ROW_COUNT());" | jq .
mysql -h <host> -u <user> --database <db> -s -r -e "
SELECT JSON_OBJECT(
'total_users', (SELECT COUNT(*) FROM users),
'active_users', (SELECT COUNT(*) FROM users WHERE status = 'active'),
'avg_posts', (SELECT AVG(post_count) FROM user_stats)
) AS report;
" | jq .
單行結果:
mysql ... -s -r -e "SELECT JSON_OBJECT('key1', column1, 'key2', column2) FROM ..." | jq .
多行結果:
mysql ... -s -r -e "SELECT JSON_ARRAYAGG(JSON_OBJECT('id', id, 'name', name)) FROM users;" | jq .
mysql -h <host> -u <user> --database <db> -s -r < script.sql 2>$null
帶變數執行:
mysql -h <host> -u <user> --database <db> -s -r -e "source script.sql;"
批次匯入 CSV:
mysql -h <host> -u <user> --database <db> -s -r -e "LOAD DATA LOCAL INFILE 'data.csv' INTO TABLE my_table FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\n' (col1, col2, col3);"
# 提交事務
mysql -h <host> -u <user> --database <db> -s -r -e "
START TRANSACTION;
INSERT INTO orders (user_id, total) VALUES (1, 100.50);
UPDATE inventory SET stock = stock - 1 WHERE product_id = 42;
COMMIT;
SELECT JSON_OBJECT('status', 'committed') AS result;
" | jq .
事務回滾:
mysql -h <host> -u <user> --database <db> -s -r -e "
START TRANSACTION;
INSERT INTO users (name) VALUES ('Test');
ROLLBACK;
SELECT JSON_OBJECT('rolled_back', true) AS result;
" | jq .
| Error Code | Meaning | Solution |
|---|---|---|
| 1045 | Access denied | 檢查使用者名稱/密碼是否正確 |
| 1049 | Unknown database | 檢查資料庫名是否存在 |
| 2003 | Can't connect to MySQL | 檢查 MySQL 服務是否啟動,埠是否開放 |
| 1146 | Table doesn't exist | 檢查表名拼寫是否正確 |
mysql -h <host> -u <user> --database <db> --connect-timeout=5 --read-timeout=30 --write-timeout=30 -s -r -e "SELECT * FROM large_table;"
mysql -h <host> -u <user> --database <db> -s -r -e "SELECT 1 AS connected;" 2>&1 | grep -q "connected" && echo "連線成功" || echo "連線失敗"
mysql -h <host> -u <user> -s -r -e "CREATE DATABASE IF NOT EXISTS new_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
mysql -h <host> -u <user> -s -r -e "SHOW DATABASES;"
mysql -h <host> -u <user> --database <db> -s -r -e "SHOW TABLES;"
mysql -h <host> -u <user> --database <db> -s -r -e "DESCRIBE users;"
mysql -h <host> -u <user> --database <db> -s -r -e "SHOW INDEX FROM users;"
mysql -h <host> -u <user> --database <db> -s -r -e "SHOW CREATE TABLE users;" | jq -s '.'
mysql -h <host> -u <user> --database <db> -s -r -e "DESCRIBE users;"
輸出欄位說明:
| 欄位 | 說明 |
|---|---|
| Field | 列名 |
| Type | 資料型別(varchar(64)、int、datetime 等) |
| Null | 是否允許 NULL(YES/NO) |
| Key | 索引型別(PRI=主鍵、UNI=唯一索引、MUL=普通索引) |
| Default | 預設值 |
| Extra | 額外屬性(auto_increment、DEFAULT_GENERATED 等) |
mysql -h <host> -u <user> --database <db> -s -r -e "
SELECT JSON_ARRAYAGG(JSON_OBJECT(
'column', Field,
'type', Type,
'nullable', NULL,
'key', Key,
'default', Default,
'extra', Extra
)) AS columns FROM information_schema.columns
WHERE table_schema = '<database>' AND table_name = '<table>'
ORDER BY ordinal_position;" | jq .
mysql -h <host> -u <user> --database <db> -s -r -e "
SELECT COLUMN_NAME, DATA_TYPE, COLUMN_TYPE, IS_NULLABLE, COLUMN_KEY, COLUMN_DEFAULT, EXTRA, COLUMN_COMMENT
FROM information_schema.columns
WHERE table_schema = '<database>' AND table_name = '<table>'
ORDER BY ordinal_position;" | jq -s '.'
mysql -h <host> -u <user> --database <db> -s -r -e "
SELECT COLUMN_NAME, DATA_TYPE, EXTRA
FROM information_schema.columns
WHERE table_schema = '<database>'
AND table_name = '<table>'
AND (COLUMN_KEY = 'PRI' OR EXTRA LIKE '%auto_increment%')
ORDER BY COLUMN_KEY DESC, ordinal_position;" | jq -s '.'
分析 SELECT 查詢執行計劃:
mysql -h <host> -u <user> --database <db> -s -r -e "EXPLAIN SELECT * FROM users WHERE phone = '13800138000';" | jq -s '.'
輸出欄位說明:
| 欄位 | 說明 |
|---|---|
| id | 查詢編號 |
| select_type | 查詢型別(SIMPLE、PRIMARY、SUBQUERY 等) |
| table | 查詢的表 |
| type | 連線型別(const、ref、range、ALL 等,ALL 表示全表掃描) |
| possible_keys | 可能使用的索引 |
| key | 實際使用的索引 |
| key_len | 索引長度 |
| rows | 預計掃描行數(越小越好) |
| Extra | 額外資訊(Using index、Using where、Using filesort 等) |
type 效能排序(從快到慢):
const > eq_ref > ref > range > index > ALL
ALL 是全表掃描,需要最佳化(加索引)。
mysql -h <host> -u <user> --database <db> -s -r -e "EXPLAIN ANALYZE SELECT * FROM users WHERE phone = '13800138000';" | jq -s '.'
比 EXPLAIN 更詳細,包含實際執行時間和實際行數。
mysql -h <host> -u <user> --database <db> -s -r -e "SHOW INDEX FROM users;" | jq -s '.'
返回每個索引的:索引名、列名、唯一性、基數、索引型別
mysql -h <host> -u <user> --database <db> -s -r -e "
SELECT
table_name,
table_rows,
ROUND(data_length / 1024 / 1024, 2) AS 'data_size_mb',
ROUND(index_length / 1024 / 1024, 2) AS 'index_size_mb',
ROUND((data_length + index_length) / 1024 / 1024, 2) AS 'total_size_mb'
FROM information_schema.tables
WHERE table_schema = '<database>'
ORDER BY (data_length + index_length) DESC;" | jq -s '.'
mysql -h <host> -u <user> --database <db> -s -r -e "
SELECT
TABLE_NAME AS 'table',
TABLE_ROWS AS 'rows',
ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2) AS 'size_mb',
ROUND(DATA_FREE / 1024 / 1024, 2) AS 'free_mb',
ENGINE,
TABLE_COMMENT
FROM information_schema.tables
WHERE table_schema = '<database>'
AND table_type = 'BASE TABLE'
ORDER BY (DATA_LENGTH + INDEX_LENGTH) DESC;" | jq -s '.'
free_mb 過大說明表有碎片,可以定期 OPTIMIZE TABLE 回收空間。
export MYSQL_PWD="yourpassword"
export MYSQL_HOST="127.0.0.1"
export MYSQL_USER="app_user"
export MYSQL_DATABASE="app_db"
mysql -s -r -e "SELECT 1;"
#!/bin/bash
# 查詢使用者統計資料(帶錯誤處理)
DB_HOST="${MYSQL_HOST:-127.0.0.1}"
DB_USER="${MYSQL_USER:-app_user}"
DB_NAME="${MYSQL_DATABASE:-app_db}"
QUERY="
SELECT JSON_OBJECT(
'timestamp', NOW(),
'summary', JSON_OBJECT(
'total_users', (SELECT COUNT(*) FROM users),
'active_users', (SELECT COUNT(*) FROM users WHERE status = 'active'),
'new_today', (SELECT COUNT(*) FROM users WHERE DATE(created_at) = CURDATE())
)
) AS report;
"
mysql -h "$DB_HOST" -u "$DB_USER" --database "$DB_NAME" -s -r -e "$QUERY" 2>&1 | jq .
MYSQL_PWD 環境變數或配置檔案--ssl-mode=REQUIRED)chmod 600 ~/.my.cnf重要提示: 使用 -s -r (--silent --raw) 組合確保 mysql 客戶端輸出純淨資料,是生成有效 JSON 的前提。
這個技能質量不錯,文件非常詳細全面,涵蓋了MySQL資料庫操作的方方面面,示例豐富實用,新手也能快速上手使用。優點是場景覆蓋廣、安全提示到位、JSON輸出處理完善。不足是缺少一些高階功能和完整的測試驗證示例,部分場景的邊界條件處理可以更完善。總體來說,這是一個值得推薦使用的資料庫操作技能。