Google μ½λμ μ½λλ₯Ό μ¬μ©νμ΅λλ€. λ§μ€ν°μμ μ΅μ μ½λλ‘ μ λ°μ΄νΈν ν μ΄μ μ μ»μ§ λͺ»ν λ€μ μ€λ₯κ° λ°μν©λλ€.
sql: Scan error on column index 7: unsupported driver -> Scan pair: <nil> -> *string
λ μ‘°μ¬ν΄ λ³΄κ² μ΅λλ€. νμ§λ§ κ·Έ μ¬μ΄μ μ΄λ―Έ μ΄μ λν΄ μκ³ κ³μλμ§μ?
μ΄μ μ½λλ NULL
κ°μ λν΄ λΉ []byte
λ₯Ό λ°ννμ¬ NULL
κ°μ λΉ λ¬Έμμ΄κ³Ό ꡬλ³ν μ μκ² νμ΅λλ€.
μμΈν λ΄μ©μ 20νΈλ₯Ό μ°Έμ‘°νμμμ€.
λ€μ λͺ©ν λλ¬Έμ database/sql
ν¨ν€μ§μμ μ€λ₯λ₯Ό λ°νν©λλ€.
* Be flexible with type conversions, but be paranoid about silent
truncation or other loss of precision.
μ΄μ NULL κ°μ΄ ν¬ν¨λ μ μλ κ²½μ° http://golang.org/pkg/database/sql/#NullStringμ μ¬μ©ν΄μΌ ν©λλ€.
κ°μ¬ν©λλ€.
μ΄μ λμμ μ 곡νλλ‘ λΌμ΄λΈλ¬λ¦¬λ₯Ό ꡬμ±νλ λ°©λ²μ κ±°μ μν©λλ€. μ΄λ€ λ©΄μμ Goμ "κΈ°λ³Έκ° 0"μ λ§μ μλ―Έκ° μμΌλ©° μλ§μ μμ©κ΅¬ μ½λλ₯Ό μ κ±°ν©λλ€. NULLμ΄ λ°μν μ μλ λ΄ μ½λμ λͺ¨λ κ³³μ ν©μ΄μ Έ μλ λμ κ΅¬μ± κ°λ₯νκ² ν κ³³μ λ£κ³ μΆμ΅λλ€. NullString λ±μ μ¬μ©νλ κ²μ μ½λ λ©΄μμ λ§€μ° μΆμ ν©λλ€.
NULLμ μ λͺ½μΌ λΏμ΄λ©° NULLμ μμ κ³ μΆμ΅λλ€. λλ λͺ μμ μΌλ‘ _my_ ν μ΄λΈμ λͺ¨λ μ΄μ NOT NULLλ‘ μ μνμ§λ§ λλλ‘ SHOW PROCESSLISTμ κ°μ λͺ λ Ήμ κ·Έ μμ NULLμ κ°μ§ κ²μ΄κ³ λ΄ μ½λλ μ κ²½ μ°μ§ μμ΅λλ€. λμ λΉ λ¬Έμμ΄μ μν©λλ€. NullStringμ μ¬μ©νκ³ ν΄λΉ .Valid μμ±μ 무μνκ³ .Stringλ§ κ°μ Έμ€κ² μ΅λλ€. μ΄μ΄ NULLμ΄λ©΄ λΉμ΄ μκ² λ©λλ€.
λλΌμ΄λ²μ μ νμ λν΄ NULLμ 0 κ°μΌλ‘ λ³ννλλ‘ μ§μν μ μμΌλ©΄(λλ μ€μ λ‘λ μ΄μ λ³μλ‘ μ€μΊνλ κ²μ 건λλ°λ κ² κ°μ΅λλ€) νλ λ° μ€λ₯ λ°μ κ°λ₯μ±μ΄ λ§μ΄ κ°μν©λλ€. λ―Έλ 보μ₯) λλ₯Ό μν΄ μΌνμμμ€. λλ λͺ¨λ μμ©κ΅¬ μ½λλ₯Ό μνμ§ μλ κ²½μ° a) μ΄μ΄ μ€μ λ‘ nullableμ΄ μλ b)κ° κ·Έλ° μμΌλ‘ μμν μ μ§λ κ°λ₯μ±μ΄ μμ΅λλ€.
λν Goμ "κΈ°λ³Έκ° 0 κ°" μ μ±
μ λ°λ₯΄λ λ°μ΄ν°λ² μ΄μ€/sql ν¨ν€μ§λ₯Ό μ νΈν©λλ€. νμν κ²½μ° Null* μ νμΌλ‘ κ³μ ꡬλΆν μ μμ§λ§ λΆννλ μ΄λ¬ν λ°©μμΌλ‘ λμμΈ κ²°μ μ΄ λ΄λ €μ‘μ΅λλ€. μλ§λ κ·Έλ€μ Go2μμ κ·Έκ²μ λ³κ²½ν κ²μ
λλ€ (κ·Έκ²μ μν΄ λμκ²μ +1).
νμ¬λ‘μλ μ΄μ λν λλΌμ΄λ² μ΅μ
μ μΆκ°ν κ³νμ΄ μμ΅λλ€. PostgreSQLμ λΉν΄ νλ‘ν μ½μ μ΄λ―Έ μλ§μ
λλ€(λ ν¨μ¨μ μ΄λΌκ³ κ°μ νκΈ°λ μ΄λ ΅μ΅λλ€). λλ λ μ΄μ λλΌμ΄λ²λ₯Ό λ€μ£½λ°μ£½νκ³ μΆμ§ μμ΅λλ€.
μ€μΊν λ¬Έμμ΄λΉ νλμ str = nullStr.Value
λ λ§μ κ²μ΄ νμ¬λ‘μλ λ ν΄λ‘μ΅λλ€.
NULL
κ°μ https://github.com/Go-SQL-Driver/MySQL/tree/zeroNULL
κ·Έλ¬λ μ΄μ μ μμ€μμλ λΆκ°λ₯ν©λλ€. 0 κ°μ []byte{}
νλ©΄ string
λ° []byte
μ€μΊν μ μμ§λ§ μ«μ μ νμΌλ‘λ μ€μΊν μ μμ΅λλ€. 0
λ‘ μ€μ νλ©΄ μ«μ μ νμΌλ‘ μ€μΊν μ μμ§λ§ string
/ []byte
λ‘ "0"μ μ»μ΅λλ€.
λλ λλΌμ΄λ²κ° μ€μ λ‘ μ΄λ»κ² μ€μΊνλμ§ μ μ΄ν΄νμ§ λͺ»νμ§λ§ λμ
dest[i]λ₯Ό 무μΈκ°λ‘ μ€μ νκ³ λλΌμ΄λ²κ° μ€μ μ 건λλ°λ©΄ μ΄λ»κ² λ κΉμ?
λͺ©μ μ§[λ]?
dest
λ κΈ°λ³Έμ μΌλ‘ []interface{}
μ¬λΌμ΄μ€μ
λλ€. interface{}
μ κΈ°λ³Έκ°μ nil
μ
λλ€. λ°λΌμ dest[i]
μ€μ μ 건λλ°λ©΄ dest[i]=nil
μ€μ κ³Ό λμΌν κ²°κ³Όκ° λνλ©λλ€.
μ§μ μ μ λ°μ΄νΈνμ΅λλ€. μνλ€λ©΄ μ§μ μ¬μ©ν΄ λ³Ό μ μμ΅λλ€.
λ΄ μꡬ μ¬νμ μλ²½ν΄ λ³΄μ΄λ©° λ€μμ μ
λ°μ΄νΈν λ μλν΄ λ³΄κ² μ΅λλ€.
λλΌμ΄λ² μ¬λ³Έ.
λ λ€λ₯Έ ν΄κ²° λ°©λ²μ΄ λ μ¬λμ΅λλ€.
λ¬Έμμ΄ λμ []byteλ₯Ό μ¬μ©νμμμ€. nil-[]byteλ₯Ό λ³ννλ©΄ λΉ λ¬Έμμ΄μ΄ λ©λλ€.
string([]byte("")) // => ""
string([]byte(nil)) // => ""
μλ§λ μ΄κ²μ μ΄μ΄ λμμμ€. μλ§λ μμ μ μ’μ κ²μ λλ€.
μ루μ : https://github.com/guregu/null
μ΄ νμ΄μ§λ μ¬μ ν κ²μ κ²°κ³Όμμ μλΉν λκ² νμλκΈ° λλ¬Έμ μ 2μΌνΈλ λ€μκ³Ό κ°μ΅λλ€.
λ¬Έμ κ° μ€μ λ‘ μλ λΆλΆμΈ λ°μ΄ν°λ² μ΄μ€ μΆμν μμ€μμλ ν΄κ²°ν μ μμ΅λλ€. λ€μμ μννμ¬ μ΄ λ¬Έμ λ₯Ό ν΄κ²°ν μ μμ΅λλ€.
SELECT
id,
COALESCE(name, '') as name
FROM users
μ΄λ κ² νλ©΄ name
μ NULLμ΄ ν¬ν¨λμ΄ μμΌλ©΄ μ€μΊν λ λΉ λ¬Έμμ΄λ‘ λ체λ©λλ€. λ³ν©μ λ리 μ§μλ©λλ€.
λ¬Έμμ΄μ΄ nullμΌ λ μμΈλ₯Ό throwν μ΄μ λ₯Ό μ΄ν΄ν μ μμ΅λλ€.
μ΄ μ λ μ μκ² ν¨κ³Όμ μ λλ€.
λ€μκ³Ό κ°μ΄ μ²λ¦¬νκΈ° μν΄ λ¬Έμμ΄ ν¬μΈν°λ₯Ό μ λ¬ν μ μμ΅λλ€.
var txt *string
checkErr(result.Scan(&txt))
// do something with type *string
κ·Έκ²μ λλ₯Ό μν΄ μ μλν©λλ€.
@Dynom μ’μ μ견 μΈμ, λ μ¬μ ν μμμ μΈκΈ ν λ§νΌ κ°μΉκ° λ μ μλ€κ³ μκ° sql.NullString
λΉμ μ λͺ©μ μ§μ λ¬Έμ λ₯Ό ν΄κ²°νλ €λ©΄ νμμ΄ νΈλ¦¬ν μ¨λ€ Scan
λ΄κ° μ΄λ μΈ‘λ©΄μΌλ‘ λ³Ό μμλ ( λ°μ΄ν°λ² μ΄μ€ μΆμν μμ€).
λν nil
κ°κ³Ό λΉ λ¬Έμμ΄μ ꡬλ³νλ κΈ°λ₯μ μ μ§ν©λλ€ .
nullstringμ μ¬μ©νλ©΄ κ°λ°μλ μλ₯Ό λ€μ΄ jsonκ³Ό κ°μ μ 보λ₯Ό νμνλ €λ κ²½μ° μ§λ voλ₯Ό μμ±ν΄μΌ ν©λλ€. μ¬κΈ°μλ λ¬Έμ κ° μμ΅λλ€. νλ₯νκ³ μ¬λ°λ₯Έ μ κ·Ό λ°©μμ΄μ§λ§ λͺ¨λ κ²½μ°μ μ΄μΉμ λ§μ§ μλ κ²½μ° μΈμ΄ μ νμΌλ‘ μΈν΄ μΆκ° μμ μ΄ λ μ μμ΅λλ€.
κ°μ₯ μ μ©ν λκΈ
μ΄ νμ΄μ§λ μ¬μ ν κ²μ κ²°κ³Όμμ μλΉν λκ² νμλκΈ° λλ¬Έμ μ 2μΌνΈλ λ€μκ³Ό κ°μ΅λλ€.
λ¬Έμ κ° μ€μ λ‘ μλ λΆλΆμΈ λ°μ΄ν°λ² μ΄μ€ μΆμν μμ€μμλ ν΄κ²°ν μ μμ΅λλ€. λ€μμ μννμ¬ μ΄ λ¬Έμ λ₯Ό ν΄κ²°ν μ μμ΅λλ€.
μ΄λ κ² νλ©΄
name
μ NULLμ΄ ν¬ν¨λμ΄ μμΌλ©΄ μ€μΊν λ λΉ λ¬Έμμ΄λ‘ λ체λ©λλ€. λ³ν©μ λ리 μ§μλ©λλ€.