Mysql: null을 *string으둜 μŠ€μΊ”ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2013λ…„ 02μ›” 28일  Β·  15μ½”λ©˜νŠΈ  Β·  좜처: go-sql-driver/mysql

Google μ½”λ“œμ˜ μ½”λ“œλ₯Ό μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€. λ§ˆμŠ€ν„°μ—μ„œ μ΅œμ‹  μ½”λ“œλ‘œ μ—…λ°μ΄νŠΈν•œ ν›„ 이전에 얻지 λͺ»ν•œ λ‹€μŒ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

sql: Scan error on column index 7: unsupported driver -> Scan pair: <nil> -> *string

더 쑰사해 λ³΄κ² μŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ κ·Έ 사이에 이미 이에 λŒ€ν•΄ μ•Œκ³  κ³„μ‹œλŠ”μ§€μš”?

wontfix

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

이 νŽ˜μ΄μ§€λŠ” μ—¬μ „νžˆ 검색 κ²°κ³Όμ—μ„œ μƒλ‹Ήνžˆ λ†’κ²Œ ν‘œμ‹œλ˜κΈ° λ•Œλ¬Έμ— 제 2μ„ΌνŠΈλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

λ¬Έμ œκ°€ μ‹€μ œλ‘œ μžˆλŠ” 뢀뢄인 λ°μ΄ν„°λ² μ΄μŠ€ 좔상화 μˆ˜μ€€μ—μ„œλ„ ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ‹€μŒμ„ μˆ˜ν–‰ν•˜μ—¬ 이 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  SELECT
    id,
    COALESCE(name, '') as name
  FROM users

μ΄λ ‡κ²Œ ν•˜λ©΄ name 에 NULL이 ν¬ν•¨λ˜μ–΄ 있으면 μŠ€μΊ”ν•  λ•Œ 빈 λ¬Έμžμ—΄λ‘œ λŒ€μ²΄λ©λ‹ˆλ‹€. 병합은 널리 μ§€μ›λ©λ‹ˆλ‹€.

λͺ¨λ“  15 λŒ“κΈ€

이전 μ½”λ“œλŠ” 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)) // => ""

http://play.golang.org/p/nivY1yBK3x

μ•„λ§ˆλ„ 이것을 μ—΄μ–΄ λ‘μ‹­μ‹œμ˜€. μ•„λ§ˆλ„ μ˜ˆμ œμ— 쒋을 κ²ƒμž…λ‹ˆλ‹€.

μ†”λ£¨μ…˜: 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λ₯Ό 생성해야 ν•©λ‹ˆλ‹€. μ—¬κΈ°μ—λŠ” λ¬Έμ œκ°€ μ—†μŠ΅λ‹ˆλ‹€. ν›Œλ₯­ν•˜κ³  μ˜¬λ°”λ₯Έ μ ‘κ·Ό λ°©μ‹μ΄μ§€λ§Œ λͺ¨λ“  κ²½μš°μ— μ΄μΉ˜μ— λ§žμ§€ μ•ŠλŠ” 경우 μ–Έμ–΄ μ œν•œμœΌλ‘œ 인해 μΆ”κ°€ μž‘μ—…μ΄ 될 수 μžˆμŠ΅λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰