Не удается ввести специальные символы в таблице Oracle - PullRequest
1 голос
/ 10 января 2012

Мне нужно проверить, читает ли мое приложение специальные символы из базы данных и отображает их точно так же. Для этого мне нужно заполнить таблицу базы данных всеми доступными специальными символами. Тем не менее, я не уверен, как я могу указать специальные символы в запросе вставки SQL. Кто-нибудь может привести меня к примеру, где я могу вставить специальный запрос в запросе? Для простоты предположим, что таблица представляет собой таблицу City, в которой Area и Avg_Tempera представляют собой 2 столбца. Если мне нужно вставить символ степени (градусы Цельсия / Фаренгейта) в столбец Avg_Tempera, как мне написать запрос?


* [Редактировать 09.01.2012 в 14:50 EST] * В соответствии с предложением Джастина Кейва ниже, я провел следующий анализ:

Таблица: create table city(area number, avg_temperature nvarchar2(10));

Дата: insert into city values (1100, '10◦C');

Query:
select dump(avg_temperature, 1010) from city where area = 1100;

O/P
DUMP(AVG_TEMPERATURE,1010)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
----------------------------------------------------------
Typ=1 Len=8 CharacterSet=AL16UTF16: 0,49,0,48,0,191,0,67                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              

Query
select value$ from sys.props$ where name='NLS_CHARACTERSET';

O/P
VALUE$
----------------
WE8MSWIN1252

Query:
select value$ from sys.props$ where name='NLS_NCHAR_CHARACTERSET';

O/P
----------------
AL16UTF16

Кажется, что вставка действительно испортила специальные символы, как предложил Джастин Кейв. Но я не могу понять, почему это происходит? Может ли кто-нибудь предоставить соответствующее предложение?

Ответы [ 2 ]

1 голос
/ 10 января 2012

Сначала вы должны знать, что такое набор символов базы данных. Затем вам нужно знать, какой набор символов использует ваше «клиентское» соединение. Жизнь всегда легче, если они одинаковы.

Если ваша база данных - utf-8, а ваш клиент - utf-8, вам не нужно экранировать символы, вы можете просто использовать кодировку utf-8 для нужного символа.

В вашем примере символом степени является кодовая точка Юникода u + 00b0.

В utf-8 это двухбайтовая последовательность: x'c2 ', x'b0'.

1 голос
/ 10 января 2012

Во-первых, вы не должны хранить символ как часть вашего столбца. Это требует, чтобы вы объявили столбец как VARCHAR, что даст вам лотов проблем в долгосрочной перспективе (например, вы не можете суммировать () для них, вы не можете использовать avg () для них и так далее)

Вы должны сохранить единицу измерения температуры во втором столбце (например, 1 = Цельсий и 2 = Фаренгейт) и перевести это при отображении данных во внешнем интерфейсе. Если вы действительно хотите сохранить символ, объявите столбцы единиц измерения как CHAR (1):

CREATE TABLE readings
(
    area               number(22),
    avg_temperature    number(10,3),
    units              varchar(2)
)

Затем вы можете вставить его следующим образом:

INSERT INTO readings 
 (area, avg_temperature, units)
VALUES 
 (1000, 12.3, '°C');

Но опять же: я бы не советовал хранить фактический символ. Храните только код!

...