私が歌川です

@utgwkk が書いている

SQLite3 から MySQL にデータを移行しようとしているができていない状態

今まで溜めていたデータを SQLite から MySQL に移行しようとしてハマって一日終了した.

github.com

とりあえずダンプファイル形式を変換するスクリプトがあるので当てる. テーブルはあらかじめ作っていたので CREATE TABLE は消したが,消す必要はなかったな……. 先頭・末尾にそれぞれ START TRANSACTION;COMMIT; を入れないと,途中どこかでエラーが出てもそこまでのデータが挿入されてしまう.

歴史的経緯で TIMESTAMP が実数型になっていたので,雑に変換するスクリプトを書いて当てた.

import sys
import re
import time
pattern = re.compile(r",(\d+(\.\d+(e\+\d+)?)?)\);")

for line in sys.stdin:
    line = line.rstrip()
    m = pattern.search(line)
    if m:
        target = m.group(1)
        unixtime = float(target)
        timestruct = time.localtime(unixtime)
        timestr = "'{}'".format(time.strftime('%Y-%m-%d %H:%M:%S', timestruct))
        print(line.replace(target, timestr))
    else:
        print(line)

データを流し込んでみたところエラーが出る.

ERROR 1366 (HY000) at line 79013: Incorrect string value: '\xF0\x9F\x98\x8C\xF0\x9F...' for column 'comment' at row 1

ググってみたところどうやら絵文字っぽい雰囲気があった. CREATE DATABASE db DEFAULT CHARACTER SET utf8mb4 してみたが直らない…….

疲れたし喉も目も終わったので今日はここまでです.