Я собираюсь предложить клиентский подход на стороне клиента к этой проблеме:
Я подозреваю, что эта проблема больше связана с несоответствием между шрифтом, которым вы пытаетесь отобразить слово супруга, и символом . Этот значок появляется, когда вы пытаетесь отобразить символ шрифтом Unicode, у которого нет символа для кода символа.
База данных Oracle покорно возвращает все символы, которые были ВСТАВЛЕНЫ в ее столбец '. Это зависит от вас и вашего приложения, чтобы интерпретировать, как это будет выглядеть, учитывая шрифт, с которым вы пытаетесь отобразить свои данные в своем приложении, поэтому я предлагаю исследовать, что это за загадочный символ, который заменяет ваши апострофы. Начните с использования рекомендованного FerranB DUMP ().
Попробуйте выполнить следующий запрос, чтобы получить код символа:
SELECT DUMP(<column with weird character>, 1016)
FROM <your table>
WHERE <column with weird character> like '%spouse%';
Если это не захватывает ваш фактический текст из базы данных, вам нужно изменить предложение WHERE, чтобы фактически захватить ошибочный столбец.
Как только вы нашли код для символа, вы можете просто заменить символ с помощью встроенной функции regex_replace () , определив необработанный шестнадцатеричный код символа и затем предоставив ASCII. Элементы управления / C0 и Basic Latin 0x0027 ('), используя код, подобный следующему:
UPDATE <table>
set <column with offending character>
= REGEX_REPLACE(<column with offending character>,
"<character code of �>",
"'")
WHERE regex_like(<column with offending character>,"<character code of �>");
Если вы не знакомы с Юникодом и различными способами кодирования символов, я рекомендую прочитать статью Джоэла Абсолютный минимум, который должен знать каждый разработчик программного обеспечения о юникоде и наборах символов (без оправданий!), Я не был, пока я не прочитал эту статью.
РЕДАКТИРОВАТЬ: Если вы видите 0x92 , вероятно, здесь несоответствие кодировки:
0x92 в CP-1252 (кодовая страница Windows по умолчанию) - это символ обратной кавычки, который выглядит как апостроф. Этот код не является допустимым символом ASCII, и он также недействителен в IS0-8859-1. Поэтому, вероятно, либо база данных находится в кодировке CP-1252 (вряд ли это возможно), либо соединение с базой данных, которое говорит CP-1252, вставило ее, либо каким-то образом апостроф был преобразован в 0x92. База данных возвращает значения, которые действительны в CP-1252 (или некоторой другой кодировке, где допустимо 0x92), но ваше клиентское соединение БД не ожидает CP-1252. Отсюда и странный знак вопроса.
И FerranB, вероятно, прав. Я бы поговорил об этом с вашим администратором базы данных или другим администратором, чтобы решить проблему. Если вы не можете, я бы попробовал сделать обновление выше (кажется, что вы не можете), или сделать это:
INSERT (<normal table columns>,...,<column with offending character>) INTO <table>
SELECT <all normal columns>, REGEX_REPLACE(<column with offending character>,
"\0092",
"\0027") -- for ASCII/ISO-8859-1 apostrophe
FROM <table>
WHERE regex_like(<column with offending character>,"\0092");
DELETE FROM <table> WHERE regex_like(<column with offending character>,"\0092");