Go и Oracle
На работе произошло

Проблемы начались, когда я попытался подключиться из прототипа к СУБД «Оракл» (такое было условие задачи). Сначала я, как и наверное многие до меня, нашёл драйвер
Для начала, проблема возникла с кодировкой. У нас в базе используется кодовая таблица 1251. Сначала (тут я сам дурак) мне показалось, что драйвер не учитывает кодировку из переменных откружения (проблема оказалась
charset := C.CString(charset_dsn)
defer C.free(unsafe.Pointer(charset))
env := new(C.OCIEnv)
rv = C.OCIEnvNlsCreate(
(**C.OCIEnv)(unsafe.Pointer(&env)),
C.OCI_DEFAULT | C.OCI_OBJECT,
nil, nil, nil, nil, 0, nil, 0, 0,
)
charset_id := C.OCINlsCharSetNameToId(unsafe.Pointer(env), (*C.oratext)(unsafe.Pointer(charset)))
rv = C.OCIEnvNlsCreate(
(**C.OCIEnv)(unsafe.Pointer(&conn.env)),
C.OCI_DEFAULT | C.OCI_OBJECT | C.OCI_THREADED | C.OCI_NO_MUTEX,
nil, nil, nil, nil, 0, nil,
charset_id, charset_id,
)Этот код должен работать вместо OCIEnvInit, если нужно использовать кодировку. Но, повторюсь, это проблема не драйвера, просто этот тот случай, когда «ложечки нашлись, а осадок остался».
Потом оказалось, что в драйвере нет превыборки (prefetch),
Я подумал, что постоянно решать проблемы драйвера — не мой путь и нашёл прекрасный Goracle, чуть более сложный, но обладающий всеми мыслимыми возможностями, порт с пайтонячего драйвера, написанного на Си.
Единственная неприятность — драйвер все строки возвращает в кодировке
Комментарии 5
Вот Багир всё очень точно рассказал. Например, скорость поиска при хранении CP1251 вместоUTF-8 выросла в два раза (видимо, просто потому, что русскоязычный текст стал вдвое компактнее).
2. Экономия памяти.
3. Исторически сложившаяся ситуация в проекте.
и еще N вариантов зачем и почему нужен 1251.