排除 MySQL 技術疑難問題: Difference between revisions

Tag: wikieditor
 
(60 intermediate revisions by the same user not shown)
Line 1: Line 1:
排除 MySQL 技術疑難問題
排除 MySQL 技術疑難問題


{{LanguageSwitcher | content = [[Troubleshooting of MySQL errors | EN]], [[排除 MySQL 技術疑難問題|漢字]]}}
{{LanguageSwitcher | content = [[Troubleshooting of MySQL errors | English]], [[排除 MySQL 技術疑難問題|漢字]]}}


本文探討了使用 MySQL 時遇到的各種常見問題,並根據其性質和影響將它們分為七個不同的類別。這些類別有助於識別潛在的問題並促進高效的故障排除。這些問題分類如下:
本文探討了使用 MySQL 時遇到的各種常見問題,並根據其性質和影響將它們分為七個不同的類別。這些類別有助於識別潛在的問題並促進高效的故障排除。這些問題分類如下:
Line 59: Line 59:
* 檢查 mysql 數據文件夾所在的磁碟空間是否足夠。例如,在 {{Linux}} 上輸入 {{kbd | key=df -h}}
* 檢查 mysql 數據文件夾所在的磁碟空間是否足夠。例如,在 {{Linux}} 上輸入 {{kbd | key=df -h}}
* 更多資訊請見 [http://stackoverflow.com/questions/18719748/error-1006-hy000-cant-create-database-errno-13-mysql-5-6-12 ERROR 1006 (HY000) 無法創建資料庫 (errno: 13) MySQL 5.6.12 - Stack Overflow]。
* 更多資訊請見 [http://stackoverflow.com/questions/18719748/error-1006-hy000-cant-create-database-errno-13-mysql-5-6-12 ERROR 1006 (HY000) 無法創建資料庫 (errno: 13) MySQL 5.6.12 - Stack Overflow]。
=== ERROR 1010: Error dropping database (can't rmdir) ===
Message: <pre>Error dropping database (can't rmdir '.\<db_name>\', errno: 17)</pre>
解決方式
* 手動刪除資料庫目錄中殘留的非 MySQL 檔案(例如 .sql 檔案),再重新執行 DROP DATABASE;或直接手動刪除整個資料夾。
根本原因
* MySQL 的 DROP DATABASE 只會移除它所管理的檔案。資料目錄中若存在其他外來檔案(例如 .sql 備份檔),將導致 rmdir 無法移除資料夾,進而觸發 errno 17(ENOTEMPTY)。


=== ERROR 1017 - Can't find file: '.\DATABASE\TABLE.frm' (errno: 22 - Invalid argument) ===
=== ERROR 1017 - Can't find file: '.\DATABASE\TABLE.frm' (errno: 22 - Invalid argument) ===
Line 185: Line 194:
</pre>
</pre>


=== Navicat error: Field doesn't have a default value ===
== 訪問和認證錯誤 ==
錯誤:
=== [Warning] Using a password on the command line interface can be insecure ===
問題描述:
使用 bash 命令匯出或匯入 MySQL 資料庫時,可能會遇到以下警告:[警告] 在命令行介面上使用密碼可能不安全。
 
<pre>
mysql: [Warning] Using a password on the command line interface can be insecure.
 
or
 
mysqldump: [Warning] Using a password on the command line interface can be insecure.
</pre>
 
這通常發生在使用如下命令時:
 
<pre>
<pre>
[ERR] 1364 - Field 'source' doesn't have a default value
mysqldump -u USERNAME -p -h 127.0.0.1 --default-character-set=utf8 DATABASE > DATABASE.sql
</pre>
</pre>


解決方案:
解決方案:要解決此警告並提高安全性,請按照以下步驟操作:
* 從 Excel 匯入到資料庫時,source 欄位是空值或者沒有指定,需要指定 source 欄位值。或者修改欄位定義,允許欄位值可以 NULL。
# 使用 [https://dev.mysql.com/doc/refman/8.4/en/mysql-config-editor.html mysql_config_editor] 設定登入路徑 (login path):{{kbd | key=<nowiki>mysql_config_editor set --login-path=local --host=localhost --user=root --password</nowiki>}}
# 匯出或匯入 MySQL 資料庫時使用登入路徑 (1) 匯出時:{{kbd | key=<nowiki>mysqldump --login-path=local --default-character-set=utf8 資料庫名稱 > 資料庫名稱.sql</nowiki>}} (2) 匯入時:{{kbd | key=<nowiki>pv 資料庫名稱.sql.gz | gunzip | mysql --login-path=local --default_character_set utf8 --force 資料庫名稱</nowiki>}}
# 查看所有已設定的登入路徑 {{kbd | key=<nowiki>mysql_config_editor print --all</nowiki>}}
 
透過使用登入路徑,可以避免在命令行中暴露密碼,解決安全警告。


== 訪問和認證錯誤 ==
=== 錯誤 1044 (42000): 拒絕使用者 'USER'@'localhost' 存取資料庫 'DATABASE_NAME' ===
=== 錯誤 1044 (42000): 拒絕使用者 'USER'@'localhost' 存取資料庫 'DATABASE_NAME' ===
訊息:{{kbd | key=<nowiki>錯誤 1044 (42000): 拒絕使用者 'USER'@'localhost' 存取資料庫 'DATABASE_NAME'</nowiki>}}
訊息:{{kbd | key=<nowiki>錯誤 1044 (42000): 拒絕使用者 'USER'@'localhost' 存取資料庫 'DATABASE_NAME'</nowiki>}}
Line 257: Line 282:
* 您可能需要刪除現有的帳戶設定並重新配置。
* 您可能需要刪除現有的帳戶設定並重新配置。


== SQL 和查詢錯誤 ==
=== 錯誤!: SQLSTATE[28000]: 無效的授權規格:1045 拒絕訪問 ===
訊息:錯誤!: {{kbd | key=<nowiki>SQLSTATE[28000]: 無效的授權規格:1045 拒絕使用者 'user'@'localhost' 存取(使用密碼:YES)</nowiki>}}
 
解決方案:
* 如果您執行了查詢 {{kbd | key=INTO OUTFILE}},您需要授予文件權限,例如:{{kbd | key=GRANT FILE ON *.* TO 'user'@'localhost';}}<ref>[https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_file MySQL :: MySQL 5.7 參考手冊 :: 6.2.1 提供的權限]</ref><ref>[https://stackoverflow.com/questions/6091427/mysql-into-outfile-access-denied-but-my-user-has-all-access-and-the-fold MYSQL into outfile "拒絕訪問" - 但我的使用者有 "全部" 訪問權限.. 且文件夾是 CHMOD 777 - Stack Overflow]</ref>。
 
 
相關問題:"錯誤!: SQLSTATE[HY000]: 一般錯誤:1290 MySQL 伺服器正在使用 --secure-file-priv 選項運行,所以它不能執行這個聲明"<ref>[https://stackoverflow.com/questions/32737478/how-should-i-tackle-secure-file-priv-in-mysql 資料庫 - 如何處理 MySQL 中的 --secure-file-priv? - Stack Overflow]</ref>
 
== SQL 查詢語法錯誤 ==
=== 捕獲異常:SQLSTATE[HY093]:無效的參數編號:參數未定義 ===
=== 捕獲異常:SQLSTATE[HY093]:無效的參數編號:參數未定義 ===
解決方案
解決方案


* 問號的數量與查詢值的數量不一致 <ref>[https://stackoverflow.com/questions/10966251/sqlstatehy093-invalid-parameter-number-parameter-was-not-defined php Invalid parameter number: parameter was not defined - Stack Overflow]</ref>
* 問號的數量與查詢值的數量不一致 <ref>[https://stackoverflow.com/questions/10966251/sqlstatehy093-invalid-parameter-number-parameter-was-not-defined php Invalid parameter number: parameter was not defined - Stack Overflow]</ref>
Line 274: Line 307:
* 您不應該在查詢 {{kbd | key=<nowiki>INTO OUTFILE ...</nowiki>}} 中使用 {{kbd | key=<nowiki>$result = $stmt->fetchAll();</nowiki>}} <ref>[http://www.tech-recipes.com/rx/1475/save-mysql-query-results-into-a-text-or-csv-file/ Save MySQL query results into a text or CSV file]</ref><ref>[https://stackoverflow.com/questions/13369164/cant-create-write-to-file-errcode-22 mysql - Can't create/write to file (Errcode: 22) - Stack Overflow]</ref>。
* 您不應該在查詢 {{kbd | key=<nowiki>INTO OUTFILE ...</nowiki>}} 中使用 {{kbd | key=<nowiki>$result = $stmt->fetchAll();</nowiki>}} <ref>[http://www.tech-recipes.com/rx/1475/save-mysql-query-results-into-a-text-or-csv-file/ Save MySQL query results into a text or CSV file]</ref><ref>[https://stackoverflow.com/questions/13369164/cant-create-write-to-file-errcode-22 mysql - Can't create/write to file (Errcode: 22) - Stack Overflow]</ref>。


== 資源和環境錯誤 ==
=== 錯誤:ASCII '\0' 出現在語句中,但這是不允許的,除非啟用了 --binary-mode 選項並且 mysql 以非互動模式運行 ===
=== 無法存取 MySQL 日誌 ===
版本:XAMPP 5.6.15-1,運行於{{Mac}}
 
原因:
* 錯誤日誌只能由名為 {{kbd | key=mysql}} 的用戶訪問<ref>打開位於以下位置的 MySQL 設定檔案:/Applications/XAMPP/xamppfiles/etc/my.cnf
<pre>
# MySQL 伺服器
[mysqld]
user = mysql
</pre></ref>
 
解決方案 <ref>[http://computerplumber.com/2009/01/using-the-chmod-command-effectively/ 有效使用 CHMOD 命令 @ Computer Plumber]</ref>:
<pre>
找到 MySQL 日誌的路徑
$ ls /Applications/XAMPP/xamppfiles/var/mysql/*.local.err
 
找出 MySQL 日誌的檔案名稱,例如:XXXMacBook-Pro.local.err
 
設置日誌的權限
$ sudo chmod 774 /Applications/XAMPP/xamppfiles/var/mysql/XXXMacBook-Pro.local.err
</pre>
 
== MySQL 伺服器已斷開 (has gone away) ==
步驟
* 在 MySQL 設定檔啟用 {{kbd | key = log_error}} 選項,例如 {{kbd | key = <nowiki>log_error="file_name_of_error_log"</nowiki>}}<ref>[https://dev.mysql.com/doc/refman/8.0/en/error-log.html MySQL :: MySQL 8.0 Reference Manual :: 5.4.2 The Error Log]</ref>。
* 範例錯誤日誌位於 {{kbd | key = <nowiki>file_name_of_error_log</nowiki>}} 如下:
 
<pre>
2019-05-23T08:52:19.989876Z 99980 [Note] 中斷連接 99980 到資料庫:'DB_NAME' 用戶:'DB_USER' 主機:'localhost' (收到的封包大於 'max_allowed_packet' 位元組)
</pre>
 
* 如果 MySQL 用戶具有 {{kbd | key = <nowiki>SUPER</nowiki>}} 權限<ref>[https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html MySQL :: MySQL 8.0 Reference Manual :: 6.2.2 Privileges Provided by MySQL]</ref>,則增加 {{kbd | key = <nowiki>max_allowed_packet</nowiki>}} 的值<ref>[https://stackoverflow.com/questions/5688403/how-to-check-and-set-max-allowed-packet-mysql-variable php - how to check and set max_allowed_packet mysql variable - Stack Overflow]</ref>。
 
== 錯誤:SQLSTATE[HY000] [2002] 沒有這樣的文件或目錄 ==
錯誤訊息:SQLSTATE[HY000] [2002] 沒有這樣的文件或目錄
 
解決方案:
* 將資料庫主機從 {{kbd | key=localhost}} 修改為 {{kbd | key=127.0.0.1}}
 
== 錯誤:ASCII '\0' 出現在語句中,但這是不允許的,除非啟用了 --binary-mode 選項並且 mysql 以非互動模式運行 ==
訊息:{{kbd | key=<nowiki>錯誤:ASCII '\0' 出現在語句中,但這是不允許的,除非啟用了 --binary-mode 選項並且 mysql 以非互動模式運行。如果期望 ASCII '\0',請將 --binary-mode 設為 1。查詢:''。</nowiki>}}
訊息:{{kbd | key=<nowiki>錯誤:ASCII '\0' 出現在語句中,但這是不允許的,除非啟用了 --binary-mode 選項並且 mysql 以非互動模式運行。如果期望 ASCII '\0',請將 --binary-mode 設為 1。查詢:''。</nowiki>}}


Line 328: Line 321:
</pre>
</pre>


 
=== 錯誤 1055: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ===
這是一段有關 MySQL 錯誤訊息和解決方案的文本,我將它翻譯成台灣中文如下:
訊息
 
```
== 錯誤代碼: 13 拒絕存取 ==
當我嘗試啟動服務,執行 {{kbd | key=<nowiki>mysqld.exe --datadir=..\data --console</nowiki>}} 後出現此訊息。(MySQL版本:5.5.5-10.0.12-MariaDB 在 {{Win}})
<pre>
<pre>
> mysqld.exe --datadir=..\data --console
查詢發生錯誤 (1055): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.posts.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
180430 10:33:38 [錯誤] mysqld.exe: 找不到檔案 'C:\MariaDB_10.0\bin\..\data\aria_log_control' (錯誤代碼: 13 "拒絕存取")
180430 10:33:38 [錯誤] mysqld.exe: 嘗試使用 aria 控制檔案 'C:\MariaDB_10.0\bin\..\data\aria_log_control' 時出錯 '無法打開檔案'
180430 10:33:38 [錯誤] 插件 'Aria' 初始化函數返回錯誤。
180430 10:33:38 [錯誤] 插件 'Aria' 註冊為儲存引擎失敗。
180430 10:33:38 [注意] InnoDB: 使用互斥鎖來計數緩衝池頁面
180430 10:33:38 [注意] InnoDB: InnoDB 記憶體堆疊已停用
180430 10:33:38 [注意] InnoDB: 互斥鎖和 rw_locks 使用 Windows 交錯函數
180430 10:33:38 [注意] InnoDB: 壓縮表使用 zlib 1.2.3
180430 10:33:38 [注意] InnoDB: 未使用 CPU crc32 指令
180430 10:33:38 [注意] InnoDB: 初始化緩衝池,大小 = 4.0G
180430 10:33:38 [注意] InnoDB: 完成緩衝池初始化
180430 10:33:38 [錯誤] InnoDB: 無法以讀寫模式打開 .\ibdata1
180430 10:33:38 [錯誤] InnoDB: 系統表空間必須可寫!
180430 10:33:38 [錯誤] 插件 'InnoDB' 初始化函數返回錯誤。
180430 10:33:38 [錯誤] 插件 'InnoDB' 註冊為儲存引擎失敗。
180430 10:33:38 [注意] 插件 'FEEDBACK' 已停用。
180430 10:33:38 [錯誤] 未知/不支持的儲存引擎: innodb
180430 10:33:38 [錯誤] 終止
 
180430 10:33:38 [注意] mysqld.exe: 關機完成
 
</pre>
</pre>


解決方案:
遇到錯誤的查詢
 
以管理員特權開啟命令行。(如何操作: [https://www.howtogeek.com/194041/how-to-open-the-command-prompt-as-administrator-in-windows-8.1/ 如何在 Windows 8 或 10 中以管理員身份開啟命令提示符])
 
 
== 錯誤!:SQLSTATE[HY000]:一般錯誤:3 寫入檔案 'xxx\Temp\xxx.tmp' 時出錯(錯誤代碼:28 - 設備上沒有剩餘空間) ==
 
錯誤訊息範例:錯誤!:SQLSTATE[HY000]:一般錯誤:3 寫入檔案 'C:\Windows\SERVIC~2\NETWOR~1\AppData\Local\Temp\MY2713.tmp' 時出錯(錯誤代碼:28 - 設備上沒有剩餘空間)
 
條件:檢查 mysql {{kbd | key=tmpdir}} 文件夾的磁碟可用空間
 
解決方案:增加 mysql {{kbd | key=tmpdir}} 文件夾的可用空間。或者使用另一個硬碟更改 mysql {{kbd | key=tmpdir}} 文件夾,該驅動器應具有更多的可用空間<ref>[https://stackoverflow.com/questions/11990887/changing-the-tmp-folder-of-mysql 更改 mysql 的 tmp 文件夾 - Stack Overflow]</ref>。
* 檢查當前的 mysql {{kbd | key=tmpdir}} 文件夾。查詢語法 {{kbd | key=<nowiki>SHOW VARIABLES LIKE 'tmpdir';</nowiki>}}。
** 在 {{Win}} 上,預設的臨時文件夾<ref>[https://answers.microsoft.com/en-us/windows/forum/windows_7-windows_programs/where-is-the-temporary-folder 臨時文件夾在哪裡?- Microsoft Community]</ref> 是 {{kbd | key=<nowiki>%TMP%</nowiki>}} = {{kbd | key=<nowiki>%USERPROFILE%\AppData\Local\Temp</nowiki>}}。
** 在 {{Linux}} 上,預設的臨時文件夾可能是 {{kbd | key=<nowiki>/tmp</nowiki>}}
* 編輯 [https://dev.mysql.com/doc/refman/5.7/en/option-files.html mysql 配置文件]
<pre>
<pre>
[mysqld]
-- 建立範例資料表
tmpdir=X:/temp
CREATE TABLE posts (
</pre>
    id INT,
* 重啟 MySQL 服務
    post_id VARCHAR(10),
    author VARCHAR(50),
    content TEXT,
    likes INT,
    post_time DATETIME
);


驗證
-- 插入範例資料
* 查詢語法 {{kbd | key=<nowiki>SHOW VARIABLES LIKE 'tmpdir';</nowiki>}} 來驗證 mysql 配置文件的修改。
INSERT INTO posts VALUES
(1, 'A123', 'Alice', '第一篇文章', 10, '2024-01-01'),
(2, 'A123', 'Bob', '推推', 5, '2024-01-02'),
(3, 'A123', 'Bob', '讚讚', 3, '2024-01-03');


 
-- 這會報錯
 
SELECT
== mysqldump: 寫入時遇到 errno 32 錯誤 ==
    id,          -- 問題: 沒有在 GROUP BY 中
錯誤情況
    post_id,
<pre>
    author,
$ mysqldump -h localhost -u root -p --force --single-transaction --default-character-set=utf8 --quick mytable  | pv | gzip -c > mytable.sql.gz
    GROUP_CONCAT(content SEPARATOR "\n") AS content,    -- 問題: 沒有在 GROUP BY 中
    likes        -- 問題: 沒有在 GROUP BY 中
FROM posts
GROUP BY post_id, author;
</pre>
</pre>


遇到錯誤訊息:
解決方案:修正後的查詢 (1) SELECT 中的每個欄位要麼放在 GROUP BY 中、或 (2) 使用彙總函數 (如 MAX, MIN, SUM, COUNT, GROUP_CONCAT)
<pre>
<pre>
-bash: pv: 命令找不到
-- 方法一:取消 `sql_mode=only_full_group_by`:
...
有兩種方法可以取消 `sql_mode=only_full_group_by`:
mysqldump: 寫入時遇到 errno 32 錯誤
</pre>


根本原因
1. 暫時性修改 (僅對當前會話有效)
* 未安裝 pv
```sql
* 輸入指令檢查 pv 是否安裝 {{kbd | key=which pv}}
SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
* 輸入指令安裝 pv:{{kbd | key=sudo yum -y install pv}} <ref>[https://installati.one/centos/7/pv/ 如何在 CentOS 7 上安裝 pv | Installati.one]</ref>
```


2. 永久性修改 (修改 MySQL 設定檔)
- 找到 MySQL 設定檔 (通常是 `my.cnf` 或 `my.ini`)
- 在 `[mysqld]` 區段加入或修改:
```ini
[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
```


參考資料
注意事項:
* [https://mysqldump.guru/mysqldump-got-errno-32-on-write.html mysqldump: 寫入時遇到 errno 32 錯誤 | mysqldump.guru]
1. 修改設定檔後需要重啟 MySQL 服務才會生效
 
2. 不建議取消這個設定,因為:
== 錯誤 1205: 鎖定等待超時,嘗試重新啟動事務 ==
  - 可能導致查詢結果不可預測
解決方案:<ref>[https://stackoverflow.com/questions/5836623/getting-lock-wait-timeout-exceeded-try-restarting-transaction-even-though-im mysql - 獲得 "鎖定等待超時,嘗試重新啟動事務" 即使我沒有使用事務 - Stack Overflow]</ref>
  - 違反 SQL 標準
# {{kbd | key=<nowiki>SHOW OPEN TABLES WHERE in_use > 0;</nowiki>}}<ref>[https://dev.mysql.com/doc/refman/5.7/en/show-open-tables.html MySQL :: MySQL 5.7 參考手冊 :: 13.7.5.24 SHOW OPEN TABLES 語法]</ref>
  - 可能在未來版本中產生相容性問題
# {{kbd | key=<nowiki>SHOW [FULL] PROCESSLIST;</nowiki>}}<ref>[https://dev.mysql.com/doc/refman/5.7/en/show-processlist.html MySQL :: MySQL 5.7 參考手冊 :: 13.7.5.29 SHOW PROCESSLIST 語法]</ref>
# {{kbd | key=<nowiki>KILL <process id>;</nowiki>}}<ref>[https://dev.mysql.com/doc/refman/5.7/en/kill.html MySQL :: MySQL 5.7 參考手冊 :: 13.7.6.4 KILL 語法]</ref>
 
相關文章
* [https://errerrors.blogspot.com/2022/10/how-to-fix-lock-wait-timeout-exceeded-try-restarting-transaction-on-mysql.html 解決 MySQL 錯誤 1205: 鎖定等待超時,嘗試重新啟動事務]


== 錯誤 1206: 鎖的總數量超過鎖表的大小 ==
建議的做法是修正 SQL 查詢而不是更改 SQL mode。
訊息:錯誤代碼:1206。鎖的總數量超過鎖表的大小


當前狀態<ref>[https://dev.mysql.com/doc/refman/8.0/en/show-variables.html MySQL :: MySQL 8.0 參考手冊 :: 13.7.6.39 SHOW VARIABLES 語法]</ref>:
-- 方法二: 把所有欄位加入 GROUP BY
* Keywin {{kbd | key = <nowiki>SHOW VARIABLES LIKE 'innodb_buffer_pool_size';</nowiki>}}。如果返回 {{kbd | key=8388608}},意味著 {{kbd | key=8388608}} 位元組 ≅ 8MB。
SELECT
    id,
    post_id,
    author,
    content,
    likes
FROM posts
GROUP BY post_id, author, id, content, likes;


解決方案:
-- 方法三: 對非 GROUP BY 的欄位使用彙總函數
* 增加 {{kbd | key = innodb_buffer_pool_size}} 例如 {{kbd | key =<nowiki>SET GLOBAL innodb_buffer_pool_size=402653184;</nowiki>}}(402653184 位元組 ~ 400MB。預設值是 8MB。)
SELECT
* 減少查詢數據的大小
    MAX(id) as id,
    post_id,
    author,
    GROUP_CONCAT(content) as contents,
    SUM(likes) as total_likes
FROM posts
GROUP BY post_id, author;
</pre>


進一步閱讀:
=== 錯誤 1235: 這個版本的 MySQL 尚未支持 'LIMIT & IN/ALL/ANY/SOME 子查詢' ===
* [http://stackoverflow.com/questions/5696857/how-to-change-value-for-innodb-buffer-pool-size-in-mysql-on-mac-os innodb - 如何在 Mac OS 上改變 MySQL 的 innodb_buffer_pool_size 的值? - Stack Overflow]。
* [https://dev.mysql.com/doc/refman/5.7/en/innodb-buffer-pool-resize.html MySQL :: MySQL 5.7 參考手冊 :: 14.6.3.2 配置 InnoDB 緩衝池大小]
 
== 錯誤 1235: 這個版本的 MySQL 尚未支持 'LIMIT & IN/ALL/ANY/SOME 子查詢' ==
訊息:錯誤 1235 (42000):這個版本的 MySQL 尚未支持 'LIMIT & IN/ALL/ANY/SOME 子查詢'。
訊息:錯誤 1235 (42000):這個版本的 MySQL 尚未支持 'LIMIT & IN/ALL/ANY/SOME 子查詢'。


Line 439: Line 412:
* [https://dev.mysql.com/doc/mysql-reslimits-excerpt/5.6/en/subquery-restrictions.html MySQL :: MySQL 限制和局限 :: 4 子查詢的限制]
* [https://dev.mysql.com/doc/mysql-reslimits-excerpt/5.6/en/subquery-restrictions.html MySQL :: MySQL 限制和局限 :: 4 子查詢的限制]


 
=== 錯誤 1267: 字元集混合不合法 (utf8mb4_general_ci,COERCIBLE) 與 (latin1_swedish_ci,IMPLICIT) 用於 'concat' 操作 ===
 
== 錯誤 1267: 字元集混合不合法 (utf8mb4_general_ci,COERCIBLE) 與 (latin1_swedish_ci,IMPLICIT) 用於 'concat' 操作 ==
錯誤情況:嘗試合併不同類型的數據,例如 CONCAT(string, int)
錯誤情況:嘗試合併不同類型的數據,例如 CONCAT(string, int)


解決方案:{{kbd | key =<nowiki>SELECT CONCAT(`string_column`, CONVERT(`int_column`, CHAR))</nowiki>}} 或 {{kbd | key =<nowiki>SELECT CONCAT(`string_column`, CAST(`int_column` AS CHAR))</nowiki>}}<ref>[https://stackoverflow.com/questions/15368753/cast-int-to-varchar mysql - 將 int 轉換為 varchar - Stack Overflow]</ref><ref>[http://blog.51cto.com/bian5399/1092772 mysql字元集問題:不合法的字元集混合 - 51CTO部落格]</ref>
解決方案:{{kbd | key =<nowiki>SELECT CONCAT(`string_column`, CONVERT(`int_column`, CHAR))</nowiki>}} 或 {{kbd | key =<nowiki>SELECT CONCAT(`string_column`, CAST(`int_column` AS CHAR))</nowiki>}}<ref>[https://stackoverflow.com/questions/15368753/cast-int-to-varchar mysql - 將 int 轉換為 varchar - Stack Overflow]</ref><ref>[http://blog.51cto.com/bian5399/1092772 mysql字元集問題:不合法的字元集混合 - 51CTO部落格]</ref>


== 錯誤 1305 - 函數 MY_TABLE.MY_FUNCTION 不存在 ==
=== 錯誤 1305 - 函數 MY_TABLE.MY_FUNCTION 不存在 ===
訊息:MySQL 錯誤 1305 - 函數 MY_TABLE.MY_FUNCTION 不存在
訊息:MySQL 錯誤 1305 - 函數 MY_TABLE.MY_FUNCTION 不存在


解決方案:修正函數名稱中的打字錯誤
解決方案:修正函數名稱中的打字錯誤


== 錯誤 1690 - BIGINT UNSIGNED 值超出範圍 ==
=== 錯誤 1690 - BIGINT UNSIGNED 值超出範圍 ===
訊息:MySQL 錯誤 #1690 (BIGINT UNSIGNED 值超出範圍)
訊息:MySQL 錯誤 #1690 (BIGINT UNSIGNED 值超出範圍)


Line 459: Line 430:
</pre>
</pre>


== 錯誤 2002: 無法連接: SQLSTATE[HY000] [2002] ==
=== 錯誤 1366: 字串值不正確 ===
訊息:SQLSTATE[HY000]: 一般錯誤:1366 字串值 '\xF0\x9F\x87\xAF\xF0\x9F...' 對於欄位 'XXX' 不正確
 
解決方案:
* 檢查 PHP PDO 的字元集。並執行 {{kbd | key=set names utf8mb4}}<ref>[https://stackoverflow.com/questions/54947392/incorrect-string-value-when-trying-to-pass-emoji-to-the-db-encoded-with-utf8mb4 php - 嘗試將使用 utf8mb4 編碼的表情符號傳遞給資料庫時字串值不正確 - Stack Overflow]</ref>
* 檢查表的配置
** 字元集 (字元集、字元集): {{kbd | key=utf8mb4}}
** 排序規則 (定序、字元序): {{kbd | key=utf8mb4_unicode_ci}}
 
=== 錯誤!: SQLSTATE[42000]: 語法錯誤或存取違規 ===
訊息:{{kbd | key=<nowiki>錯誤!: SQLSTATE[42000]: 語法錯誤或存取違規:1064 您在 SQL 語法中有錯誤;請檢查手冊,了解您的 MySQL 伺服器版本對應的正確語法以用於 ...</nowiki>}}
 
解決方案:
* [[SQL syntax debug | SQL 語法除錯]]
* [https://www.eversql.com/sql-syntax-check-validator/ SQL 語法檢查在線上,SQL 驗證器,即時 SQL 編譯器在線上 - EverSQL] {{exclaim}} 不支持 [https://www.php.net/manual/en/pdo.prepare.php PHP: PDO::prepare],其中查詢語法包含問號。
 
== 連接和網路錯誤 ==
=== MySQL 伺服器已斷開 (has gone away) ===
步驟
* 在 MySQL 設定檔啟用 {{kbd | key = log_error}} 選項,例如 {{kbd | key = <nowiki>log_error="file_name_of_error_log"</nowiki>}}<ref>[https://dev.mysql.com/doc/refman/8.0/en/error-log.html MySQL :: MySQL 8.0 Reference Manual :: 5.4.2 The Error Log]</ref>。
* 範例錯誤日誌位於 {{kbd | key = <nowiki>file_name_of_error_log</nowiki>}} 如下:
 
<pre>
2019-05-23T08:52:19.989876Z 99980 [Note] 中斷連接 99980 到資料庫:'DB_NAME' 用戶:'DB_USER' 主機:'localhost' (收到的封包大於 'max_allowed_packet' 位元組)
</pre>
 
* 如果 MySQL 用戶具有 {{kbd | key = <nowiki>SUPER</nowiki>}} 權限<ref>[https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html MySQL :: MySQL 8.0 Reference Manual :: 6.2.2 Privileges Provided by MySQL]</ref>,則增加 {{kbd | key = <nowiki>max_allowed_packet</nowiki>}} 的值<ref>[https://stackoverflow.com/questions/5688403/how-to-check-and-set-max-allowed-packet-mysql-variable php - how to check and set max_allowed_packet mysql variable - Stack Overflow]</ref>。
 
=== 錯誤:SQLSTATE[HY000] [2002] 沒有這樣的文件或目錄 ===
錯誤訊息:SQLSTATE[HY000] [2002] 沒有這樣的文件或目錄
 
解決方案:
* 將資料庫主機從 {{kbd | key=localhost}} 修改為 {{kbd | key=127.0.0.1}}
 
=== 錯誤 2002: 無法連接: SQLSTATE[HY000] [2002] ===
Windows Cygwin 終端機狀況:
Windows Cygwin 終端機狀況:
<pre>
<pre>
Line 478: Line 483:
* 如果仍然不行,重啟伺服器並重新啟動 MySQL 服務。
* 如果仍然不行,重啟伺服器並重新啟動 MySQL 服務。


== 錯誤 2002: SQLSTATE[HY000] [2002] 通常只允許每個通訊端位址 (協議/網路位址/埠) 的一次使用 ==
=== 錯誤 2002: SQLSTATE[HY000] [2002] 通常只允許每個通訊端位址 (協議/網路位址/埠) 的一次使用 ===


訊息:(1) [2002] 通常只允許每個通訊端位址 (協議/網路位址/埠) 的一次使用 (2) "SQLSTATE[HY000] [2002] 一次只能用一個通訊端位址 (通訊協定/網路位址/連接埠)。" 用中文表示
訊息:(1) [2002] 通常只允許每個通訊端位址 (協議/網路位址/埠) 的一次使用 (2) "SQLSTATE[HY000] [2002] 一次只能用一個通訊端位址 (通訊協定/網路位址/連接埠)。" 用中文表示
Line 484: Line 489:
解決方案:[https://stackoverflow.com/questions/10317974/mysql-php-error2002-only-one-usage-of-each-socket-address-protocol-network-a MySQL/PHP 錯誤:(2002) 通常只允許每個通訊端位址 (協議/網路位址/埠) 的一次使用 - Stack Overflow]
解決方案:[https://stackoverflow.com/questions/10317974/mysql-php-error2002-only-one-usage-of-each-socket-address-protocol-network-a MySQL/PHP 錯誤:(2002) 通常只允許每個通訊端位址 (協議/網路位址/埠) 的一次使用 - Stack Overflow]


 
=== 錯誤 2003 (HY000): 無法連接到 'IP' 上的 MySQL 伺服器 ===
== 錯誤 2003 (HY000): 無法連接到 'IP' 上的 MySQL 伺服器 ==
'''錯誤 2003 (HY000): 無法連接到 'IP' 上的 MySQL 伺服器'''
'''錯誤 2003 (HY000): 無法連接到 'IP' 上的 MySQL 伺服器'''


Line 514: Line 518:
* [http://faq.webyog.com/content/23/15/en/error-no-2003-can_t-connect.html SQLyog MySQL 管理員常見問答 - 錯誤號 2003: 無法連接...]
* [http://faq.webyog.com/content/23/15/en/error-no-2003-can_t-connect.html SQLyog MySQL 管理員常見問答 - 錯誤號 2003: 無法連接...]


 
=== 錯誤 2013: 在查詢過程中與 MySQL 伺服器失去連接 ===
== 錯誤 2013: 在查詢過程中與 MySQL 伺服器失去連接 ==
訊息:錯誤代碼:2013。在查詢過程中與 MySQL 伺服器失去連接
訊息:錯誤代碼:2013。在查詢過程中與 MySQL 伺服器失去連接


Line 530: Line 533:
</pre>
</pre>


== 錯誤 1366: 字串值不正確 ==
=== 解決 Host 'xx.xx.xxx.xxx' is blocked because of many connection errors ===
訊息:SQLSTATE[HY000]: 一般錯誤:1366 字串值 '\xF0\x9F\x87\xAF\xF0\x9F...' 對於欄位 'XXX' 不正確
 
錯誤訊息
 
<pre>
Host 'xx.xx.xxx.xxx' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'
</pre>
 
了解問題狀況
 
(1) 查詢門檻值
 
MySQL 的機制是:同一個來源主機(依 IP 或 hostname 判斷),累積達到 `max_connect_errors` 設定的次數後,就會自動把這個來源封鎖,拒絕它繼續連線。
 
<pre>
SHOW VARIABLES LIKE 'max_connect_errors';
</pre>
 
查到的門檻值是 100。
 
(2) 查詢目前被記錄/封鎖的 host
 
<pre>
SELECT IP, HOST, SUM_CONNECT_ERRORS, COUNT_HOST_BLOCKED_ERRORS
FROM performance_schema.host_cache
ORDER BY SUM_CONNECT_ERRORS DESC;
</pre>
 
確認唯一被鎖的 IP 就是 `xx.xx.xxx.xxx`,`SUM_CONNECT_ERRORS` 剛好等於門檻值 100,且沒有其他 IP 受影響。
 
 
解決問題
 
⚠️ 提醒:`flush-hosts` / `FLUSH HOSTS` 會清空整個 host cache,不是只清單一 IP。如果查詢結果中還有其他 host 的記錄,執行後會一併重置。若為共用正式環境,執行前建議先跟其他管理者確認。
 
(1) 到終端機或命令提示字元,輸入指令
 
<pre>
mysqladmin -u root -p flush-hosts
</pre>
 
或
 
<pre>
mysql -u root -p
進入 MySQL SHELL 後再輸入指令:FLUSH HOSTS;
</pre>
 
補充:`FLUSH HOSTS` 語法自 MySQL 8.0.23 起已標示為 deprecated,8.4 版本中移除<ref>[https://dev.mysql.com/doc/refman/8.4/en/performance-schema-host-cache-table.html MySQL :: MySQL 8.4 Reference Manual :: 29.12.22.3 The host_cache Table]</ref><ref>[https://oneuptime.com/blog/post/2026-03-31-mysql-fix-max-connect-errors-blocked-hosts/view How to Fix max_connect_errors and Blocked Hosts in MySQL]</ref>。若環境版本較新,可改用官方建議的替代語法:
<pre>
TRUNCATE TABLE performance_schema.host_cache;
</pre>
 
(2) 執行後驗證
 
<pre>
SELECT IP, HOST, SUM_CONNECT_ERRORS, COUNT_HOST_BLOCKED_ERRORS
FROM performance_schema.host_cache
ORDER BY SUM_CONNECT_ERRORS DESC;
</pre>
 
結果:沒有資料行(0 rows),代表 host_cache 已清空,先前的連線錯誤紀錄與封鎖狀態都已重設,該 IP 應可正常連線。
 
=== 從 MySQL 資料轉移至 MSSQL ===
情況: 需要將 MySQL 資料庫中的資料同步或遷移至 Microsoft SQL Server。
 
解決方案:
* (手動方式) 匯出 MySQL 資料為 MSSQL 相容格式: {{kbd | key=<nowiki>mysqldump --compatible=mssql [database_name]</nowiki>}}<ref>[https://dev.mysql.com/doc/refman/8.4/en/mysqldump.html#option_mysqldump_compatible MySQL :: MySQL 8.4 Reference Manual :: 6.5.4 mysqldump — A Database Backup Program]</ref>
* (自動方式) 使用 [https://learn.microsoft.com/en-us/sql/ssma/sql-server-migration-assistant?view=sql-server-ver17 Microsoft SQL Server Migration Assistant]、''$'' [https://www.webyog.com/product/sqlyog SQLyog] 工具 (適用於 {{Win}})。設定特定查詢來控制要從 MySQL 轉移至 Microsoft SQL Server 的資料。
 
常見挑戰:
* 大型資料集的連線逾時問題: 參考 2013 錯誤的故障排除方法,例如延長逾時參數或實施批次處理。
* 資料類型不相容: 在遷移前驗證兩系統間的類型對應,以防止資料損壞或遺失。
 
== 資源和環境錯誤 ==
=== 無法存取 MySQL 日誌 ===
版本:XAMPP 5.6.15-1,運行於{{Mac}}
 
原因:
* 錯誤日誌只能由名為 {{kbd | key=mysql}} 的用戶訪問<ref>打開位於以下位置的 MySQL 設定檔案:/Applications/XAMPP/xamppfiles/etc/my.cnf
<pre>
# MySQL 伺服器
[mysqld]
user = mysql
</pre></ref>
 
解決方案 <ref>[http://computerplumber.com/2009/01/using-the-chmod-command-effectively/ 有效使用 CHMOD 命令 @ Computer Plumber]</ref>:
<pre>
找到 MySQL 日誌的路徑
$ ls /Applications/XAMPP/xamppfiles/var/mysql/*.local.err
 
找出 MySQL 日誌的檔案名稱,例如:XXXMacBook-Pro.local.err
 
設置日誌的權限
$ sudo chmod 774 /Applications/XAMPP/xamppfiles/var/mysql/XXXMacBook-Pro.local.err
</pre>
 
=== 錯誤代碼: 11 資源暫時無法取得 ===
錯誤訊息:'''Can't create a new thread (errno 11 "Resource temporarily unavailable")'''
 
解決方案:[https://errerrors.blogspot.com/2026/06/xampp-mariadb-errno-11-open-files-limit.html 解決 XAMPP MariaDB 遇到 errno 11「Resource temporarily unavailable」錯誤]
 
=== 錯誤代碼: 13 拒絕存取 ===
當我嘗試啟動服務,執行 {{kbd | key=<nowiki>mysqld.exe --datadir=..\data --console</nowiki>}} 後出現此訊息。(MySQL版本:5.5.5-10.0.12-MariaDB 在 {{Win}})
<pre>
> mysqld.exe --datadir=..\data --console
180430 10:33:38 [錯誤] mysqld.exe: 找不到檔案 'C:\MariaDB_10.0\bin\..\data\aria_log_control' (錯誤代碼: 13 "拒絕存取")
180430 10:33:38 [錯誤] mysqld.exe: 嘗試使用 aria 控制檔案 'C:\MariaDB_10.0\bin\..\data\aria_log_control' 時出錯 '無法打開檔案'
180430 10:33:38 [錯誤] 插件 'Aria' 初始化函數返回錯誤。
180430 10:33:38 [錯誤] 插件 'Aria' 註冊為儲存引擎失敗。
180430 10:33:38 [注意] InnoDB: 使用互斥鎖來計數緩衝池頁面
180430 10:33:38 [注意] InnoDB: InnoDB 記憶體堆疊已停用
180430 10:33:38 [注意] InnoDB: 互斥鎖和 rw_locks 使用 Windows 交錯函數
180430 10:33:38 [注意] InnoDB: 壓縮表使用 zlib 1.2.3
180430 10:33:38 [注意] InnoDB: 未使用 CPU crc32 指令
180430 10:33:38 [注意] InnoDB: 初始化緩衝池,大小 = 4.0G
180430 10:33:38 [注意] InnoDB: 完成緩衝池初始化
180430 10:33:38 [錯誤] InnoDB: 無法以讀寫模式打開 .\ibdata1
180430 10:33:38 [錯誤] InnoDB: 系統表空間必須可寫!
180430 10:33:38 [錯誤] 插件 'InnoDB' 初始化函數返回錯誤。
180430 10:33:38 [錯誤] 插件 'InnoDB' 註冊為儲存引擎失敗。
180430 10:33:38 [注意] 插件 'FEEDBACK' 已停用。
180430 10:33:38 [錯誤] 未知/不支持的儲存引擎: innodb
180430 10:33:38 [錯誤] 終止
 
180430 10:33:38 [注意] mysqld.exe: 關機完成
 
</pre>


解決方案:
解決方案:
* 檢查 PHP PDO 的字元集。並執行 {{kbd | key=set names utf8mb4}}<ref>[https://stackoverflow.com/questions/54947392/incorrect-string-value-when-trying-to-pass-emoji-to-the-db-encoded-with-utf8mb4 php - 嘗試將使用 utf8mb4 編碼的表情符號傳遞給資料庫時字串值不正確 - Stack Overflow]</ref>
* 檢查表的配置
** 字元集 (字元集、字元集): {{kbd | key=utf8mb4}}
** 排序規則 (定序、字元序): {{kbd | key=utf8mb4_unicode_ci}}


== 錯誤!: SQLSTATE[28000]: 無效的授權規格:1045 拒絕訪問 ==
以管理員特權開啟命令行。(如何操作: [https://www.howtogeek.com/194041/how-to-open-the-command-prompt-as-administrator-in-windows-8.1/ 如何在 Windows 8 或 10 中以管理員身份開啟命令提示符])
訊息:錯誤!: {{kbd | key=<nowiki>SQLSTATE[28000]: 無效的授權規格:1045 拒絕使用者 'user'@'localhost' 存取(使用密碼:YES)</nowiki>}}
 
=== 錯誤!:SQLSTATE[HY000]:一般錯誤:3 寫入檔案 'xxx\Temp\xxx.tmp' 時出錯(錯誤代碼:28 - 設備上沒有剩餘空間) ===
 
錯誤訊息範例:錯誤!:SQLSTATE[HY000]:一般錯誤:3 寫入檔案 'C:\Windows\SERVIC~2\NETWOR~1\AppData\Local\Temp\MY2713.tmp' 時出錯(錯誤代碼:28 - 設備上沒有剩餘空間)
 
條件:檢查 mysql {{kbd | key=tmpdir}} 文件夾的磁碟可用空間
 
解決方案:增加 mysql {{kbd | key=tmpdir}} 文件夾的可用空間。或者使用另一個硬碟更改 mysql {{kbd | key=tmpdir}} 文件夾,該驅動器應具有更多的可用空間<ref>[https://stackoverflow.com/questions/11990887/changing-the-tmp-folder-of-mysql 更改 mysql 的 tmp 文件夾 - Stack Overflow]</ref>。
* 檢查當前的 mysql {{kbd | key=tmpdir}} 文件夾。查詢語法 {{kbd | key=<nowiki>SHOW VARIABLES LIKE 'tmpdir';</nowiki>}}。
** 在 {{Win}} 上,預設的臨時文件夾<ref>[https://answers.microsoft.com/en-us/windows/forum/windows_7-windows_programs/where-is-the-temporary-folder 臨時文件夾在哪裡?- Microsoft Community]</ref> 是 {{kbd | key=<nowiki>%TMP%</nowiki>}} = {{kbd | key=<nowiki>%USERPROFILE%\AppData\Local\Temp</nowiki>}}。
** 在 {{Linux}} 上,預設的臨時文件夾可能是 {{kbd | key=<nowiki>/tmp</nowiki>}}
* 編輯 [https://dev.mysql.com/doc/refman/5.7/en/option-files.html mysql 配置文件]
<pre>
[mysqld]
tmpdir=X:/temp
</pre>
* 重啟 MySQL 服務
 
驗證
* 查詢語法 {{kbd | key=<nowiki>SHOW VARIABLES LIKE 'tmpdir';</nowiki>}} 來驗證 mysql 配置文件的修改。
 
=== mysqldump: 寫入時遇到 errno 32 錯誤 ===
錯誤情況
<pre>
$ mysqldump -h localhost -u root -p --force --single-transaction --default-character-set=utf8 --quick mytable  | pv | gzip -c > mytable.sql.gz
</pre>
 
遇到錯誤訊息:
<pre>
-bash: pv: 命令找不到
...
mysqldump: 寫入時遇到 errno 32 錯誤
</pre>
 
根本原因
* 未安裝 pv
* 輸入指令檢查 pv 是否安裝 {{kbd | key=which pv}}
* 輸入指令安裝 pv:{{kbd | key=sudo yum -y install pv}} <ref>[https://installati.one/centos/7/pv/ 如何在 CentOS 7 上安裝 pv | Installati.one]</ref>
 
 
參考資料
* [https://mysqldump.guru/mysqldump-got-errno-32-on-write.html mysqldump: 寫入時遇到 errno 32 錯誤 | mysqldump.guru]
 
=== 錯誤 1205: 鎖定等待超時,嘗試重新啟動事務 ===
解決方案:<ref>[https://stackoverflow.com/questions/5836623/getting-lock-wait-timeout-exceeded-try-restarting-transaction-even-though-im mysql - 獲得 "鎖定等待超時,嘗試重新啟動事務" 即使我沒有使用事務 - Stack Overflow]</ref>
# {{kbd | key=<nowiki>SHOW OPEN TABLES WHERE in_use > 0;</nowiki>}}<ref>[https://dev.mysql.com/doc/refman/5.7/en/show-open-tables.html MySQL :: MySQL 5.7 參考手冊 :: 13.7.5.24 SHOW OPEN TABLES 語法]</ref>
# {{kbd | key=<nowiki>SHOW [FULL] PROCESSLIST;</nowiki>}}<ref>[https://dev.mysql.com/doc/refman/5.7/en/show-processlist.html MySQL :: MySQL 5.7 參考手冊 :: 13.7.5.29 SHOW PROCESSLIST 語法]</ref>
# {{kbd | key=<nowiki>KILL <process id>;</nowiki>}}<ref>[https://dev.mysql.com/doc/refman/5.7/en/kill.html MySQL :: MySQL 5.7 參考手冊 :: 13.7.6.4 KILL 語法]</ref>
 
相關文章
* [https://errerrors.blogspot.com/2022/10/how-to-fix-lock-wait-timeout-exceeded-try-restarting-transaction-on-mysql.html 解決 MySQL 錯誤 1205: 鎖定等待超時,嘗試重新啟動事務]
 
=== 錯誤 1206: 鎖的總數量超過鎖表的大小 ===
訊息:錯誤代碼:1206。鎖的總數量超過鎖表的大小
 
當前狀態<ref>[https://dev.mysql.com/doc/refman/8.0/en/show-variables.html MySQL :: MySQL 8.0 參考手冊 :: 13.7.6.39 SHOW VARIABLES 語法]</ref>:
* Keywin {{kbd | key = <nowiki>SHOW VARIABLES LIKE 'innodb_buffer_pool_size';</nowiki>}}。如果返回 {{kbd | key=8388608}},意味著 {{kbd | key=8388608}} 位元組 ≅ 8MB。


解決方案:
解決方案:
* 如果您執行了查詢 {{kbd | key=INTO OUTFILE}},您需要授予文件權限,例如:{{kbd | key=GRANT FILE ON *.* TO 'user'@'localhost';}}<ref>[https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_file MySQL :: MySQL 5.7 參考手冊 :: 6.2.1 提供的權限]</ref><ref>[https://stackoverflow.com/questions/6091427/mysql-into-outfile-access-denied-but-my-user-has-all-access-and-the-fold MYSQL into outfile "拒絕訪問" - 但我的使用者有 "全部" 訪問權限.. 且文件夾是 CHMOD 777 - Stack Overflow]</ref>。
* 增加 {{kbd | key = innodb_buffer_pool_size}} 例如 {{kbd | key =<nowiki>SET GLOBAL innodb_buffer_pool_size=402653184;</nowiki>}}(402653184 位元組 ~ 400MB。預設值是 8MB。)
* 減少查詢數據的大小


進一步閱讀:
* [http://stackoverflow.com/questions/5696857/how-to-change-value-for-innodb-buffer-pool-size-in-mysql-on-mac-os innodb - 如何在 Mac OS 上改變 MySQL 的 innodb_buffer_pool_size 的值? - Stack Overflow]。
* [https://dev.mysql.com/doc/refman/5.7/en/innodb-buffer-pool-resize.html MySQL :: MySQL 5.7 參考手冊 :: 14.6.3.2 配置 InnoDB 緩衝池大小]


相關問題:"錯誤!: SQLSTATE[HY000]: 一般錯誤:1290 MySQL 伺服器正在使用 --secure-file-priv 選項運行,所以它不能執行這個聲明"<ref>[https://stackoverflow.com/questions/32737478/how-should-i-tackle-secure-file-priv-in-mysql 資料庫 - 如何處理 MySQL 中的 --secure-file-priv? - Stack Overflow]</ref>
=== PHP 嚴重錯誤:在使用 adminer 導入 SQL.GZ 文件時,允許的記憶體大小耗盡 ===


== 錯誤!: SQLSTATE[42000]: 語法錯誤或存取違規 ==
解決方案:使用基本的 mysqldump 命令來生成備份文件。然後使用 mysql 命令導入備份。
訊息:{{kbd | key=<nowiki>錯誤!: SQLSTATE[42000]: 語法錯誤或存取違規:1064 您在 SQL 語法中有錯誤;請檢查手冊,了解您的 MySQL 伺服器版本對應的正確語法以用於 ...</nowiki>}}


解決方案:
=== 資料庫所在硬碟空間不足的狀況 ===
* [[SQL 語法除錯]]
* [https://www.eversql.com/sql-syntax-check-validator/ SQL 語法檢查在線上,SQL 驗證器,即時 SQL 編譯器在線上 - EverSQL] {{exclaim}} 不支持 [https://www.php.net/manual/en/pdo.prepare.php PHP: PDO::prepare],其中查詢語法包含問號。


[http://errerrors.blogspot.com/2016/07/mysql.html Err: 解決 MySQL 資料庫所在硬碟空間不足的狀況]


== Navicat 錯誤:[Exp] OLE 錯誤 800A03EC ==
== 其他工具特定錯誤 ==
=== Navicat 錯誤:[Exp] OLE 錯誤 800A03EC ===
錯誤訊息:
錯誤訊息:
<pre>
<pre>
Line 572: Line 756:
* 限制 MySQL 查詢的行數
* 限制 MySQL 查詢的行數


== Navicat 錯誤: 導入數據筆數不一致 ==
=== Navicat error: Field doesn't have a default value ===
錯誤:
<pre>
[ERR] 1364 - Field 'source' doesn't have a default value
</pre>
 
解決方案:
* 從 Excel 匯入到資料庫時,source 欄位是空值或者沒有指定,需要指定 source 欄位值。或者修改欄位定義,允許欄位值可以 NULL。
 
=== Navicat 錯誤: 導入數據筆數不一致 ===
錯誤:
錯誤:


Line 580: Line 773:
* [https://errerrors.blogspot.com/2023/11/blog-post.html 解決 NaviCat 匯入 Excel 檔案到資料庫,出現資料總筆數不一致的問題] (written in Mandarin)
* [https://errerrors.blogspot.com/2023/11/blog-post.html 解決 NaviCat 匯入 Excel 檔案到資料庫,出現資料總筆數不一致的問題] (written in Mandarin)


== PHP 嚴重錯誤:在使用 adminer 導入 SQL.GZ 文件時,允許的記憶體大小耗盡 ==
=== 如何解決 “zsh: operation not permitted: xxx.sql” ===
 
解決方案:使用基本的 mysqldump 命令來生成備份文件。然後使用 mysql 命令導入備份。
 
==資料庫所在硬碟空間不足的狀況 ==
[http://errerrors.blogspot.com/2016/07/mysql.html Err: 解決 MySQL 資料庫所在硬碟空間不足的狀況]
 
== 如何解決 “zsh: operation not permitted: xxx.sql” ==
錯誤情況
錯誤情況
<pre>
<pre>
Line 604: Line 790:
* 尋找終端機應用程式或 iTerm2 或你正在使用的任何終端機,勾選允許完整磁碟存取的方框。
* 尋找終端機應用程式或 iTerm2 或你正在使用的任何終端機,勾選允許完整磁碟存取的方框。
* 重啟你的終端機。
* 重啟你的終端機。
== 延伸閱讀 ==
* 如果找不到想要的問題答案,可以前往stackoverflow 尋找 [https://stackoverflow.com/questions/tagged/mysql Unanswered 'mysql' Questions - Stack Overflow]


== References ==
== References ==
<references/>
<references/>


{{Template:Troubleshooting}}
{{Template: Data factory flow in Mandarin}}


[[Category:MySQL]]
[[Category: MySQL]]
[[Category:Database]]
[[Category: Database]]
[[Category:Data Science]]
[[Category: Data Science]]
[[Category: Revised with LLMs]]