Slide 1

Slide 1 text

日本MySQLユーザ会ができるまで MySQL30周年&ユーザ会25周年記念イベント 2025-03-25 とみたまさひろ / @tmtms 1

Slide 2

Slide 2 text

自己紹介 • とみたまさひろ ▪ ▪ ▪ • 長野県北部在住 • 趣味 MySQL / Ruby / 文字化け / マンガ / アニメ • 日本MySQLユーザ会の名ばかり代表 • (最近仕事では PostgreSQL 使ってる) https://bsky.app/profile/tmtms.net https://x.com/tmtms https://tmtms.net 2

Slide 3

Slide 3 text

最近は MySQL Parameters というページのメンテをしてます https://mysql-params.tmtms.net/ 3

Slide 4

Slide 4 text

MySQL歴 1997年〜 前世紀! 4

Slide 5

Slide 5 text

今日は昔話をしろと言われたので昔話をします 5

Slide 6

Slide 6 text

MySQLとの出会い 6

Slide 7

Slide 7 text

1997〜 7

Slide 8

Slide 8 text

会社の社内ツールとして某RDBを使っていた 8

Slide 9

Slide 9 text

C から使うためには ESQL/C という C 埋め込み謎言語を使わないといけなかった 9

Slide 10

Slide 10 text

めちゃ使いづらい 普通に C の関数として使いたい 10

Slide 11

Slide 11 text

フリーソフトでいいのがないか探してみた 11

Slide 12

Slide 12 text

MySQL と PostgreSQL というのが見つかった 12

Slide 13

Slide 13 text

どっちでも良かったんだけど INSERT と SELECT を測ってみたら MySQL の方が速かったんで MySQL でいいや 13

Slide 14

Slide 14 text

ここで問題が 14

Slide 15

Slide 15 text

ドキュメントが英語 今も昔も英語は苦手 15

Slide 16

Slide 16 text

仕方ないから日本語に翻訳しつつ読む 16

Slide 17

Slide 17 text

3行前の文は忘れるので翻訳した文を書き残しながら読む 17

Slide 18

Slide 18 text

それを続けてたら日本語ドキュメントができた 18

Slide 19

Slide 19 text

じゃあせっかくだから公開するかー Monty にメールで「公開してもいい?」って聞いたら 「いいよ」って返ってきたので公開した 1997/10 MySQL 3.21.13-alpha 19

Slide 20

Slide 20 text

日本語 20

Slide 21

Slide 21 text

MySQL には日本語の charset がなかった 21

Slide 22

Slide 22 text

当時 Unicode はなかった (あったけど一般的ではなかった) 日本語は EUC-JP を使うのが普通 22

Slide 23

Slide 23 text

EUC-JP 1文字 1〜3バイト • 半角英数(1バイト) 00-7F (ASCII と同じ) • 全角文字(2バイト) A1-FE A1-FE • 半角カナ(2バイト) 8E A1-DF • 補助漢字(3バイト) 8F A1-FE A1-FE 23

Slide 24

Slide 24 text

MySQL の ascii charset • 00-7F ASCII • 80-FF そのままの1バイト (当時) 24

Slide 25

Slide 25 text

文字列だろうがバイト列だろうが ちゃんと格納できて取り出せてインデックスが効けばいい ascii charset を使えばだいたい問題なく使えた 25

Slide 26

Slide 26 text

問題は LIKE 26

Slide 27

Slide 27 text

LIKE のワイルドカード • _ - 任意の1文字 • % - 0文字以上の任意の文字 27

Slide 28

Slide 28 text

「音楽」の中に「山」がある 「ここ」には「海」がある mysql> SELECT '音楽' LIKE '%山%'; +--------------------+ | '音楽' LIKE '%山%' | +--------------------+ | 1 | +--------------------+ mysql> SELECT 'ここ' LIKE '%海%'; +--------------------+ | 'ここ' LIKE '%海%' | +--------------------+ | 1 | +--------------------+ 28

Slide 29

Slide 29 text

「音楽」と「山」 • 音楽 - B2 BB B3 DA • 山 - BB B3 「ここ」と「海」 • ここ - A4 B3 A4 B3 • 海 - B3 A4 29

Slide 30

Slide 30 text

問題は文字境界 ascii charset じゃダメだった 30

Slide 31

Slide 31 text

ということで LIKE を EUC-JP に対応するパッチを作った configure --with-charset=jeuc 1997/11 MySQL 3.21.13-alpha 向け 31

Slide 32

Slide 32 text

シフトJISの問題 32

Slide 33

Slide 33 text

シフトJIS • ASCII ▪ 00-7F • 半角カナ(1バイト) ▪ A1-DF • 全角文字(2バイト) ▪ 1バイト目 81-9F or E0-FC ▪ 2バイト目 40-7E or 80-FC 2バイト目に 0x5C \(¥) が含まれてる 33

Slide 34

Slide 34 text

\ は特殊文字 エスケープシーケンス • \n - 改行(0A) • \t - タブ(09) • \0 - NUL • \\ - \ • \' - ' • \" - " 34

Slide 35

Slide 35 text

たとえば • あ\n → あ + 改行 • あ\\n → あ\n 35

Slide 36

Slide 36 text

でも • 表n → 95 + 改行 • 表\n → 表n 36

Slide 37

Slide 37 text

• 表 → 95 5C • 表n → 95 5C "n" → 95 + "\n" → 95 改行 • 表\n → 95 5C 5C "n" → 95 + "\\" + "n" → 表n 37

Slide 38

Slide 38 text

2バイト目が \ になる文字 ソ Ы Ⅸ 噂 浬 欺 圭 構 蚕 十 申 曾 箪 貼 能 表 暴 予 禄 兔 喀 媾 彌 拿 杤 歃 濬 畚 秉 綵 臀 藹 觸 軆 鐔 饅 鷭 偆 砡 纊 犾 38

Slide 39

Slide 39 text

文字がおかしくなるだけならいいけど(よくないけど) SQL インジェクションになることも 39

Slide 40

Slide 40 text

SQL インジェクション 外部から入力された文字列をそのまま SQL に埋め込むのはまずい なのでエスケープする str = "abc' OR 1 -- " "WHERE str='#{str}'" #=> "WHERE str='abc' OR 1 -- '" str = "abc' OR 1 -- ".gsub("'", "\\'") #=> "abc\' OR 1 -- " "WHERE str='#{str}'" #=> "WHERE str='abc\' OR 1 -- '" 40

Slide 41

Slide 41 text

「表」をエスケープする サーバーがシフトJISに対応してないと「表\'」→「表'」 やばい str = "表' OR 1 -- ".gsub("'", "\\'") #=> "表\' OR 1 -- " "WHERE str='#{str}'" #=> "WHERE str='表\' OR 1 -- '" WHERE str='表' OR 1 -- ' 41

Slide 42

Slide 42 text

ということでパッチを作った 汎用的にマルチバイト文字を扱える仕組みを作って EUC-JP とシフトJISの両方に対応した 42

Slide 43

Slide 43 text

韻を踏んで ujis(EUC-JP) と sjis(シフトJIS) configure --with-charset=ujis または configure --with-charset=sjis 1998/3 MySQL 3.21.25-gamma 向け 43

Slide 44

Slide 44 text

MySQL の新しいバージョンが出るたびにパッチを作るのが面倒 44

Slide 45

Slide 45 text

本家に取り込んでもらえればいいのでは 45

Slide 46

Slide 46 text

Monty にメールを送ったら取り込まれた! 1998/10 Hi! Patch applied. This will be in MySQL 3.22.9. 46

Slide 47

Slide 47 text

日本語のその後 3.23 で mysqld 実行時に charset を指定できるようになった この時点で自分の実装ではなくなった 4.1 でカラム毎に charset を指定できるようになったり クライアント-サーバー間で文字コードを変換できるようになったり だいたい今と同じになった 47

Slide 48

Slide 48 text

メーリングリスト 48

Slide 49

Slide 49 text

日本語マニュアルを公開したり日本語パッチを公開したことで MySQL の質問が自分のメールアドレスに来るようになった 当時は SPAM もなくて普通にメールアドレスも載せてた 49

Slide 50

Slide 50 text

個人間だけで情報をやりとりするのはもったいない メーリングリストとか誰か作ってくれないかなー 50

Slide 51

Slide 51 text

…と Web に書いてたらソフトエージェンシーさんが作ってくれた 当時のドメインは database.ne.jp 1998/1 51

Slide 52

Slide 52 text

2年ほどメーリングリストを運用して MySQL の使い方とか日本語の問題とかの知見がたまってきたので ウェブで公開しよう 52

Slide 53

Slide 53 text

せっかくだから「日本MySQLユーザ会」とかをでっちあげて、 それなりのドメイン名も取って、そのホームページにしてしま うというのはどうでしょう? http://www.mysql.gr.jp/mysqlml/mysql/msg/1651 53

Slide 54

Slide 54 text

mysql.gr.jp を取得 2000/3 54

Slide 55

Slide 55 text

「日本MySQLユーザ会」誕生! 55

Slide 56

Slide 56 text

略称は MyNA myna: ( MySQL Nippon Association ) こじつけ マイナ 意味: 九官鳥 # MySQLって、日本じゃマイナー(MINOR)だよね。 # それは昔の話さ。と言える日をまつ人の集団。 http://www.mysql.gr.jp/mysqlml/mysql/msg/1730 56

Slide 57

Slide 57 text

名前をつけるの重要 2000/4 に翔泳社さんから ユーザー会有志で「MySQL徹底入門」の執筆をしないかという打診あり 57

Slide 58

Slide 58 text

メーリングリストで執筆者を募って執筆開始 58

Slide 59

Slide 59 text

「MySQL徹底入門」日本MySQLユーザ会著 2001/1 初版発行 日本初のMySQL単独書籍 59

Slide 60

Slide 60 text

今も続いてる 歴代の表紙は myna=九官鳥 にちなんでる 60

Slide 61

Slide 61 text

ということでMyNA発足までの話でした これ以降はみなさんが語ってくれるでしょう 61

Slide 62

Slide 62 text

おまけ 62

Slide 63

Slide 63 text

メーリングリストの月ごとの投稿数 63

Slide 64

Slide 64 text

もうメーリングリストの時代ではないのだろうなぁ 64

Slide 65

Slide 65 text

と思うのだけどメーリングリストシステムを新しくした メールを使わずに掲示板的に使うこともできるのでよろしければどうぞ https://ml.mysql.gr.jp/ 65

Slide 66

Slide 66 text

おわり ネコチャン絵文字 ©しかまつ https://note.com/shikamatsu/n/nd217dc0617db 66