Заменить символ в результатах SQL - PullRequest
2 голосов
/ 17 июля 2009

Это из запроса Oracle SQL. Он содержит эти странные узкие прямоугольные формы в базе данных в местах, где должны быть апострофы. (Хотелось бы, чтобы мы могли вставить скриншоты сюда)

Это выглядит так, когда я копирую и вставляю результаты.

spouse�s

есть ли способ написать инструкцию SQL SELECT, которая ищет этот символ в поле и заменяет его апострофом в результатах?

Изменить: мне нужно изменить только результаты в инструкции SELECT для целей отчетности, я не могу изменить базу данных.


Я управлял этим

выбор дампа (' ') из двойного;

который вернул

Тип = 96 Лен = 3: 239,191,189

Кажется, это работает до сих пор

выберите перевод («Как зовут вашего супруга?», « », «») из двойного;

но это не работает

выберите перевод (Имя поля, ' ', '' '') из TableName


Выберите FN из TN

Как зовут вашего супруга?

SELECT DUMP (FN, 1016) от TN

Typ = 1 Len = 33 CharacterSet = US7ASCII: 57,68,61,74,20,69,73,20,79,6f, 75,72,20,73,70,6f, 75,73,65 92 * * тысяча тридцать пять, 73,20,66,69,72,73,74,20,6e, 61,6d, 65,3f * * тысяча тридцать-шесть EDIT: Итак, я установил, что это символ обратной цитаты. Я не могу обновить базу данных, поэтому я пытаюсь этот код

ВЫБРАТЬ REGEX_REPLACE (FN, "\ 0092", "\ 0027") ОТ TN

и я получаю ORA-00904: «Regex_Replace»: неверный идентификатор

Ответы [ 5 ]

6 голосов
/ 17 июля 2009

Кажется, это проблема с вашей конфигурацией charset. Проверьте свои NLS_LANG и другие значения среды / regedit NLS_xxx. Вы должны проверить сервер оракула, ваш клиент и клиент вставки этих данных.

Попробуйте DUMP значение. Вы можете сделать это с помощью простого выбора:

SELECT DUMP(the_column)
  FROM xxx
 WHERE xxx

ОБНОВЛЕНИЕ : Я думаю, что прежде чем пытаться заменить, поищите корень проблемы. Если это происходит из-за проблем с кодировкой, вы можете получить большие проблемы с плохими данными.

ОБНОВЛЕНИЕ 2 : Ответ на комментарии. Проблема может быть не на стороне сервера базы данных, может быть на стороне клиента. Проблема (если это проблема) может заключаться в переводе на сервер в / из клиента. Это для сервера-клиента плохой конфигурации-координации. Например, если сервер определил кодировку UTF8, а ваш клиент использует US7ASCII, тогда все значения будут отображаться как?.

Другой подход может заключаться в том, что если сервер определил кодировку UTF8, а ваш клиент также UTF8, но приложение не может отображать символы UTF8, то проблема заключается в стороне приложения.

ОБНОВЛЕНИЕ 3 : На ваших примерах:

  • select translate('What. Это работает, потому что символ exactly точно такой же: вы вставили с обеих сторон.
  • select translate(Fieldname. Это не работает, потому что не хранится в базе данных, это символ, который получает клиент, может быть потому, что какой-то перевод происходит из таблицы данных, пока он не будет показан вам.

Следующий шаг: посмотрите синтаксис DUMP и попытайтесь извлечь коды для загадочного символа (из таблицы без вставки !).

2 голосов
/ 17 июля 2009

Я бы сказал, что есть большая вероятность, что персонаж будет «умной цитатой» с одним галочкой (я ненавижу это имя). Интеллектуальные кавычки - это символы 91-94 (в кодировке Windows) или Unicode U + 2018, U + 2019, U + 201C и U + 201D.

1 голос
/ 17 июля 2009

Я собираюсь предложить клиентский подход на стороне клиента к этой проблеме:

Я подозреваю, что эта проблема больше связана с несоответствием между шрифтом, которым вы пытаетесь отобразить слово супруга, и символом . Этот значок появляется, когда вы пытаетесь отобразить символ шрифтом 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");
0 голосов
/ 17 июля 2009

TRANSLATE () - полезная функция для замены или устранения известных односимвольных кодов.

0 голосов
/ 17 июля 2009

Прежде чем сделать это, вы должны понять, что на самом деле произошло. Мне кажется, что кто-то вставил не-ascii строки в базу данных. Например Юникод или UTF-8. Прежде чем исправить это, убедитесь, что это действительно ошибка. Апостроф существует во многих формах, а не только в «».

...