У нас возникают проблемы с текстом, который кодируется несколькими способами, но хранится в одном столбце таблицы. Длинная история. В MySQL я могу "выбрать hex (str) из таблицы where", и я вижу байты строки точно так, как я их устанавливал.
В Oracle у меня есть строка, которая начинается с турецкого символа İ, который является символом Юникода 0x0130 "ЛАТИНСКОЕ КАПИТАЛОВОЕ ПИСЬМО С ДВОЙНОЙ ВЫШЕ". Это в моей печатной копии книги Unicode версии 2.0. В UTF-8 этот символ равен 0xc4b0.
У нас очень старые клиентские приложения, которые нам нужно поддерживать. Они отправят нам этот текст в "windows-1254". Раньше мы просто закрывали глаза, хранили его и отдавали обратно. Теперь нам нужен Unicode, или нам дается Unicode.
Итак, у меня есть:
SQL> select id, name from table where that thing;
ID NAME
------ ------------------------
746 Ý
Это имеет смысл, потому что "İ" - это 0xdd в windows-1254, а 0xdd в wondows-1252 - "Ý". Мой терминал предположительно установлен на обычный Windows-1252.
Но:
SQL> select id, rawtohex(name) from table where that thing;
ID RAWTOHEX(NAME)
------ ------------------------
746 C39D
Кажется, что нет никакого эквивалента функции hex (name) в MySQL. Но я должен что-то упустить. Что мне здесь не хватает?
Мой код Java должен принять utf8, который мне предоставляется, и сохранить копию utf8 и копию окна-1252. Код java дает мне:
bytes (utf8): c4 b0
bytes (1254): dd
Тем не менее, когда я его сохраняю, клиент не получает правильный символ. И когда я пытаюсь понять, что на самом деле хранит Oracle, я получаю мусор, увиденный выше. Я понятия не имею, откуда C39D. Любые предложения?
У нас есть ojdbc14.jar, встроенный во все наши приложения, и мы подключаемся к базе данных, которая говорит, что это "Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production".