записывать символы в БД с правильным набором символов - PullRequest
5 голосов
/ 02 октября 2011

Я столкнулся с проблемой записи китайских иероглифов в базу данных Oracle.Вот некоторая информация для справки.

  1. Среда: Oracle 8

    select userenv('language') form dual;
    

    возвращает

    American.America.UTF8
    
  2. Разработка:

    .NET2/C#
    
  3. Набор символов клиента:

    gb2312
    

Я просто проверяю значение записи в таблице вручную, результат правильный и должен бытьследующим образом:

VALUE: 朋友        //chinese word means 'friend'
DUMP: 197,243,211,209 //caculated by Oracle dump() function

Используя код для записи, снимите код следующим образом:

Encoding def = Encoding.Default;
Encoding utf8 = Encoding.UTF8;
byte[] bytes = def.GetBytes("朋友");
//For debug
//string debug = "";
//foreach(byte b in bytes)
//   debug += b.ToString() + " ";
//Debug.WriteLine(debug); //That will display 197,243,211,209 as the same as the Dump value mentioned
string value = utf8.GetString(bytes);
//I also try, string value = utf8.GetString(Encoding.Convert(def,utf8,bytes))
string sql = String.Format("UPDATE T SET C='{0}' WHERE...",value);
//execute the sql...

После этого значение, хранимое в СУБД, неверно, и значение, и его дампрезультат.

1 Ответ

1 голос
/ 03 октября 2011
Decimal Hexadecimal Binary
197     c5          1100 0101
243     f3          1111 0011
211     d3          1101 0011
209     d1          1101 0001

Глядя на Википедия Мы видим, что 197 - это первый байт двухбайтовой последовательности, 243 - это первый байт четырехбайтовой последовательности, 211 - это первый байт двухбайтовой последовательности.208 - первый байт двухбайтовой последовательности.Это не действительно UTF-8.Не могли бы вы сказать нам, что такое кодовые точки Unicode для двух символов??

РЕДАКТИРОВАТЬ Ah, GB2313, c5f3 - кодовая точка Unicode u + 670b.И d3d1 это u + 53cb.(Найдено с помощью конвертера в http://demo.icu -project.org / icu-bin / выпуклый? Conv = ibm-1383_P110-1999 & ShowLocales & s = ALL # ShowLocales )

Дважды проверьте набор символов клиентаклиент Oracle использует.То, что я видел (в Oracle 10gR2), это то, что если клиент Oracle имеет ту же кодировку символов, что и сервер базы данных, символы не будут переведены (поскольку они имеют одинаковый набор символов), но они не будут проверены.Похоже, что они были одинаковыми во время ручной вставки, и значения GB2313 были вставлены для нужных вам символов, что недопустимо в БД, поскольку это utf8.

Обратите внимание, Oracle "utf8"Набор символов не полный современный UTF-8, но вместо CESU-8.В этом случае не проблема, поскольку эти символы находятся на базовой многоязычной плоскости и имеют одинаковую кодировку в UTF-8 и CESU-8.Самая ранняя ссылка, которую я смог найти, была для Oracle 8i: http://download.oracle.com/docs/cd/A87860_01/doc/server.817/a76966/appa.htm#971460.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...