Slide 1

Slide 1 text

go-sql-driver/mysql と DPMMBUJPO 2024.08.29 MyNA 会 @mita2

Slide 2

Slide 2 text

໰୊Ͱ͢ʂ utf8mb4_general_ci を利⽤したいです。 Go⾔語の go-sql-driver/mysql ドライ バを利⽤した場合、接続⼦のパラメータとして適切なものはどれでしょう︖(複数可) サーバはMySQL 8.0で、パラメータはデフォルトとします。 1. charset=utf8mb4 2. collation=utf8mb4_general_ci 3. charset=utf8mb4&collation=utf8mb4_general_ci 4. 指定なし TRM0QFO lNZTRMz lSPPU1BTTXPSE! ͜͜ z

Slide 3

Slide 3 text

〜 正解発表 〜

Slide 4

Slide 4 text

1.charset=utf8mb4

Slide 5

Slide 5 text

1.charset=utf8mb4 º

Slide 6

Slide 6 text

1.charset=utf8mb4 • × utf8mb4_0900_ai_ci になる • MySQL 8.0 で utf8mb4 のデフォルトの照合順序が general_ci から 0900_ai_ci に変更されました。 • charset=utf8mb4 では COLLATE句のない SET NAMES utf8mb4 が実⾏される

Slide 7

Slide 7 text

2.collation=utf8mb4_general_ci

Slide 8

Slide 8 text

2.collation=utf8mb4_general_ci ⿝

Slide 9

Slide 9 text

2.collation=utf8mb4_general_ci • ○ utf8mb4_general_ciになる

Slide 10

Slide 10 text

3 は、あとまわし

Slide 11

Slide 11 text

4.指定なし

Slide 12

Slide 12 text

4.指定なし ⿝

Slide 13

Slide 13 text

4.指定なし • ○ utf8mb4_general_ciになる • go-sql-driver/mysql のデフォルトは utf8mb4_general_ci • collation=utf8mb4_general_ci と同じ動作

Slide 14

Slide 14 text

3. charset=utf8mb4&collation=utf8mb4_general_ci

Slide 15

Slide 15 text

3. charset=utf8mb4&collation=utf8mb4_general_ci ˚

Slide 16

Slide 16 text

3. charset=utf8mb4&collation=utf8mb4_general_ci • ○ v1.8 (2024/03/09 Release) 以降では、utf8mb4_general_ciになる • × v1.8 より前では、 utf8mb4_0900_ai_ci になる

Slide 17

Slide 17 text

)BOETIBLFSFTQPOTF SET NAMES [COLLATE ] Initial Handshake Handshake response Client • ハンドシェイク時にもCOLLATIONは指定できる • 接続後に、改めてSET NAMESすると、ハンドシェイク時の値から切り替わる

Slide 18

Slide 18 text

• charset=utf8mb4&collation=utf8mb4_general_ci WΑΓલͷڍಈ SET NAMES utf8mb4 Initial Handshake Handshake response utf8mb4_general_ci Client $0--"5&͕ࢦఆ͞Ε͍ͯͳ͍ ͨΊɺ.Z42-Ҏ߱Ͱ͸ @BJ@DJʹͳΔ

Slide 19

Slide 19 text

• charset=utf8mb4&collation=utf8mb4_general_ci WҎ߱ͷڍಈ SET NAMES utf8mb4 COLLATE utf8mb4_general_ci Initial Handshake Handshake response utf8mb4_general_ci Client

Slide 20

Slide 20 text

ͦͷଞؾ͍ͮͨ͜ͱ • v1.8 より前では、charsetとcollationがチグハグな組み合わせでも通る • charset=latin1&collation=utf8mb4_general_ci • collation だけ指定するほうがちょびっと速い • SET NAMES するかどうかは charsetの指定の有無 • 指定できない collation がある mysql> select max(id) from COLLATIONS; +---------+ | max(id) | +---------+ | 323 | +---------+ IUUQTHJUIVCDPNHPTRMESJWFSNZTRMCMPCGDCGEGDGGFDGDPMMBUJPOTHP-

Slide 21

Slide 21 text

まとめ

Slide 22

Slide 22 text

go-sql-driver/mysql౴͑ No ドライバのパラメータ handshake SET NAMES general_ci になる︖ 1 charset=utf8mb4 utf8mb4_general_ci SET NAMES utf8mb4 × 2 collation=utf8mb4_general_ci utf8mb4_general_ci - ◯ 3 charset=utf8mb4& collation=utf8mb4_general_ci utf8mb4_general_ci SET NAMES utf8mb4 (>= 1.8) SET NAMES utf8mb4 COLLATE utf8mb4_general_ci (< v1.8) ◯ >= v1.8 × < v1.8 4 なし utf8mb4_general_ci - ◯

Slide 23

Slide 23 text

感想 • 両⽅、明⽰的に指定するパターンが⼀番⼿堅いかと思ったが、そうでない ケースが発⾒できて⾯⽩かった。 • ハンドシェイクと SET NAMES による 指定の2通りがあることが知れた。

Slide 24

Slide 24 text

5IBOLT