最開始起 NextCloud 的時候,淺羽圖方便用了 SQLite 做資料庫。隨着使用時間和帳號的增加,SQLite 的效率漸漸難看,於是決定遷移到 MariaDB。
參考官方手冊的相關章節,NextCloud 可以自動完成資料庫的遷移。只需要在容器中設定好資料庫,然後運行:
$ sudo docker-compose exec --user www-data nextcloud php occ db:convert-type --all-apps --clear-schema mysql <username> <hostname> <database> --password="$DB_PASSWORD"
就可以了。然而實際情況總是比預想的要難,運行之後,出現了錯誤:
[Doctrine\DBAL\Exception\DriverException]
An exception occurred while executing 'INSERT INTO `oc_comments` (`id`, `ch
ildren_count`, `actor_type`, `actor_id`, `message`, `verb`, `creation_times
tamp`, `latest_child_timestamp`, `object_type`, `object_id`, `parent_id`, `
topmost_parent_id`) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' with params
["8", "0", "users", "asaba", "\ud83d\ude05Emoji \u597d\u4e86", "comment",
"2018-06-15 04:36:09", null, "chat", "2", "0", "0"]:
SQLSTATE[22007]: Invalid datetime format: 1366 Incorrect string value: '\xF
0\x9F\x98\x85Em...' for column 'message' at row 1
[Doctrine\DBAL\Driver\PDOException]
SQLSTATE[22007]: Invalid datetime format: 1366 Incorrect string value: '\xF
0\x9F\x98\x85Em...' for column 'message' at row 1
[PDOException]
SQLSTATE[22007]: Invalid datetime format: 1366 Incorrect string value: '\xF
0\x9F\x98\x85Em...' for column 'message' at row 1
仔細看,認爲應該是字符編碼的問題。官方文檔中有提到:
In order to use Emojis (textbased smilies) on your Nextcloud server with a MySQL database, the installation needs to be tweaked a bit.
因此,需要先開啓 4-byte 支援再去轉換資料庫。知道了原因,解決起來就很簡單了。首先,讓 MariaDB 的實例帶上參數啓動以支援 4-byte:
--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
然後設定 NextCloud 使用 MySQL 4-byte:
$ sudo docker-compose exec --user www-data nextcloud php occ config:system:set mysql.utf8mb4 --type boolean --value="true"
最後執行轉換,就可以正常遷移到 MariaDB 了。轉換之後會自動退出維護模式並且改好資料庫設定,data/owncloud.db 也可以刪除掉了。
發佈留言