Mysql: uint32 ๋ฐ uint64 ์œ ํ˜• ์ œ๊ณต

์— ๋งŒ๋“  2017๋…„ 11์›” 28์ผ  ยท  7์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: go-sql-driver/mysql

๋ฌธ์ œ ์„ค๋ช…

์ผ๋ฐ˜ MySQL INT ์œ ํ˜•์„ ๊ธฐ๋ณธ ํ‚ค๋กœ ์‚ฌ์šฉํ•  ๋•Œ ์‚ฌ์šฉ์ž๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ 32b unsigned int ์ธ INT UNSIGNED ์œ ํ˜•์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ๋ณธ db.sql ํŒจํ‚ค์ง€์—๋Š” ์ด๋Ÿฌํ•œ ์œ ํ˜•์ด ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ reddit์—์„œ ๋…ผ์˜ํ–ˆ๊ณ  ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค ์ด์ด ์œ ํ˜•์„ ์ž‘์„ฑํ•˜๋„๋ก ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์žฌ์‚ฌ์šฉ ํ•  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด MySQL ํŠน์ • ์œ ํ˜• (๋ฐ”์ดํŠธ ํฌ๊ธฐ)์ด๊ธฐ ๋•Œ๋ฌธ์—์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์žˆ์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ db.sql ํŒจํ‚ค์ง€๋กœ ํ‘ธ์‹œ ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ์กฐ์ฒด๊ฐ€ MySQL์˜ ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋‚˜ํƒ€๋‚ด์•ผํ•˜๋ฏ€๋กœ NullInt64๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ INT UNSIGNED ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฒ„ํ”Œ๋กœ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. BIGINT UNSIGNED -์ตœ๋Œ€ ๊ฐ’์ด NullInt64์— ๋งž์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ ์ฝ”๋“œ

type MyTable struct {
    ID uint
}

type MyOtherTable struct {
    ID uint
    MyTableID mysql.NullUint32 // Nullable relationship with MyTable
}

์ด๋Ÿฌํ•œ ์œ ํ˜•์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘์„ฑํ•˜๊ธฐ ์ „์—์ด ํŒจํ‚ค์ง€์— ํฌํ•จ ๋˜์–ด๋„ ๊ดœ์ฐฎ์€์ง€ ๋ฌผ์–ด๋ณด๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.
๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

databassql issue enhancement question

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@arnehormann Go ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค / sql ํŒจํ‚ค์ง€ github์—์„œ ์ด์— ๋Œ€ํ•œ ๋…ผ์˜๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ, rsc ์—์„œ์ด ์ง€์›์ด golang mysql ๋“œ๋ผ์ด๋ฒ„์— ํŠน๋ณ„ํžˆ ์ถ”๊ฐ€๋˜์–ด์•ผํ•œ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค (๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ด๋Ÿฌํ•œ ํฐ ๊ฐ’์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ).

์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค : https://github.com/golang/go/issues/9373

๋ชจ๋“  7 ๋Œ“๊ธ€

์šฐ๋ฆฌ๋Š” https://golang.org/pkg/database/sql/driver/#Value ์— ๋ฌถ์—ฌ ์žˆ์œผ๋ฉฐ ๋“œ๋ผ์ด๋ฒ„๋Š” ์ด๋Ÿฌํ•œ ์ œ์•ฝ ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค / sql๊ณผ ํ†ต์‹ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค / SQL์—์„œ ๋ˆ„๋ฝ ๋œ NullTime์„ ์ œ์™ธํ•˜๊ณ ๋Š” ์ถ”๊ฐ€ ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@arnehormann Go ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค / sql ํŒจํ‚ค์ง€ github์—์„œ ์ด์— ๋Œ€ํ•œ ๋…ผ์˜๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ, rsc ์—์„œ์ด ์ง€์›์ด golang mysql ๋“œ๋ผ์ด๋ฒ„์— ํŠน๋ณ„ํžˆ ์ถ”๊ฐ€๋˜์–ด์•ผํ•œ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค (๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ด๋Ÿฌํ•œ ํฐ ๊ฐ’์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ).

์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค : https://github.com/golang/go/issues/9373

๋„ค, ๊ทธ๋Š” ์ผ์Šต๋‹ˆ๋‹ค.
```์ด๋Ÿฌํ•œ ํฐ ๊ฐ’์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (์˜ˆ : SQLite)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค / SQL์ด ๊ธฐ๋ณธ์ ์œผ๋กœ์ด๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.
์ง€๊ธˆ์€ ๊ทธ ๊ฒฐ์ •์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด์˜ ๋ชจ๋“  ๋™์ธ์„ ๊นจ๋œจ๋ฆด ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

MySQL์ด ์ด๋Ÿฌํ•œ ํฐ ๊ฐ’์„ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ MySQL ๋“œ๋ผ์ด๋ฒ„๋Š”
driver.Stmt ๊ตฌํ˜„ driver.ColumnConverter๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ํ—ˆ์šฉ
์‚ฌ์šฉ์ž ์ •์˜ ValueConverter์˜ uint64s.

์ฆ‰, ํฐ uint64๋ฅผ ํ—ˆ์šฉํ•˜๋ ค๋Š” MySQL ๋“œ๋ผ์ด๋ฒ„๋Š” ์˜ค๋Š˜๋‚  ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค / SQL์—๋Š” ์ฝ”๋“œ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
```

๋™์˜ํ•ฉ๋‹ˆ๋‹ค. uint64๊ฐ€ ๊ณง ์˜ค๋ฒ„ํ”Œ๋กœ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์ ๊ธฐ ๋•Œ๋ฌธ์— uint64๋ณด๋‹ค uint32์— ๋” ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
์–ด๋–ป๊ฒŒํ•ด์•ผํ• ๊นŒ์š”? ์ด์— ๋Œ€ํ•œ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ ์ƒ์„ฑ์„ ๊ธฐ๊บผ์ด ๋„์™€ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด๋ฏธ uint64๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด๋ฏธ uint64๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ BIGINT UNSIGNED nullable ํ•„๋“œ์— ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” NullUint64๋Š” ์•„๋‹™๋‹ˆ๋‹ค.
์˜ค๋ฒ„ํ”Œ๋กœ๋ฅผ ํŠธ๋ฆฌ๊ฑฐ ํ•  ์ˆ˜์žˆ๋Š” ๋Œ€์‹  NullInt64๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

uint64์— ๋Œ€ํ•œ rsc์˜ ์˜๊ฒฌ์„ ์–ธ๊ธ‰ ํ–ˆ์œผ๋ฏ€๋กœ rsc๊ฐ€ ์ œ์•ˆํ•œ๋Œ€๋กœ ์ด๋ฏธ ๊ตฌํ˜„๋˜์—ˆ๋‹ค๊ณ  ๋Œ€๋‹ตํ–ˆ์Šต๋‹ˆ๋‹ค.
uint64 ๋Œ€์‹  NullUint64๋ฅผ ์ œ์•ˆํ•˜๋Š” ๊ฒฝ์šฐ rsc์˜ ์ฃผ์„์„ ์–ธ๊ธ‰ํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋ ‡๊ฒŒ ๋งํ•˜์‹ญ์‹œ์˜ค. ํ˜ผ๋ž€ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด๋ฏธ uint64๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ BIGINT UNSIGNED nullable ํ•„๋“œ์— ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” NullUint64๋Š” ์•„๋‹™๋‹ˆ๋‹ค.
์˜ค๋ฒ„ํ”Œ๋กœ๋ฅผ ํŠธ๋ฆฌ๊ฑฐ ํ•  ์ˆ˜์žˆ๋Š” ๋Œ€์‹  NullInt64๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค

https://github.com/Thor-x86/nullable

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰