2016-11-07 4 views
0

Когда я пытаюсь сохранить Özyeğin университет в базу данных оракула символов, он сохраняет как Özye ğ в университет => г = ğOracle базы данных специальные сберегательные, как ASCII

Это происходит в моей базе данных клиентов, а не в шахте, проверил и оба используют одни и те же charactersets => NLS_CHARACTERSET = AL32UTF8

Любые идеи

+0

Я не уверен, что я понять свой вопрос - [они выглядят одинаково для меня] (https://i.imgur.com/KiseYIG.png). –

+0

Оба они 'U + 011F':« Латинская малая буква G с бревеном ». В чем дело? –

+0

Какой инструмент вы используете для вставки и запроса данных? –

ответ

4

Не знаете, как это выглядит на экране; на моем (с настройками по умолчанию U.S) персонаж точно такой же. Сказанное: часто проблема заключается не в наборе символов базы данных (на сервере), а в интерфейсном наборе символов (клиенте) - либо во время ввода, либо во время поиска (или и то и другое). Чтобы увидеть точные символы, хранящиеся в базе данных, использовать DUMP так:

select 'Özyeğin' as str, dump('Özyeğin') as codes from dual; 

Что будет с уверенностью сказать, что хранится в БД, так что вы можете по крайней мере сузить проблему - это с того, что хранится или просто с тем, что отображается при выборе из БД? (На самом деле, не используйте DUMP() ТОЧНО, как я показал, скорее, select dump(col_name) from table_name where id = ..., где id - некоторое значение id для строки, содержащей университетское имя, вы хотите увидеть, что такое IN A TABLE в базе данных, а не что-то, как в моем примере. col_name - это название столбца, в котором указано название университета.)

Чтобы проиллюстрировать эту проблему, здесь короткая сессия в SQL * Plus. Обратите внимание, что с моим стандартным набором символов (см. Комментарии ниже - MY default - cp 1252, потому что я СДЕЛАЛ, ЧТОБЫ БЫТЬ) (кодовая страница 1252, название Microsoft для набора западноевропейских символов), становится «g» (даже в базе данных - он переводится интерфейсом перед тем, как он даже отправляется в базу данных), но если я изменю набор символов на 1254 (для турецкого), буква будет сохранена, а DUMP отображает правильный код для кодовой страницы 1254.

SQL> select 'Özyeğin' as str, dump('Özyeğin') as codes from dual; 

STR  CODES 
------- ----------------------------------------- 
Özyegin Typ=96 Len=7: 214,122,121,101,103,105,110 


SQL> host chcp 1254 
Active code page: 1254 

SQL> select 'Özyeğin' as str, dump('Özyeğin') as codes from dual; 

STR  CODES 
------- ----------------------------------------- 
Özyeğin Typ=96 Len=7: 214,122,121,101,240,105,110 

Итак: если бы я использовал западноевропейский набор символов для ввода данных в базу данных, а затем г было изменено на г (это не имеет значения, что множество DATABASE характер, потому что он никогда не получал г, его получен g). Однако, если все было в порядке, вы все равно можете видеть g в выходном файле, если внешний интерфейс, используемый для просмотра результатов из базы данных, не использует турецкий набор символов. (Тем не менее, в последнем случае вы не можете получить «g» - вы получите любой код 240 в наборе символов клиента, в cp 1252 это ð, not g ...)

+0

При запуске SQL * Plus он наследует кодовую страницу из командной строки 'cmd.exe'. Это (по умолчанию) не CP1252, а скорее всего CP437 (для США) или CP850 (большинство европейских стран). Вы можете получить текущую кодовую страницу с помощью команды 'chcp'. –

+0

@WernfriedDomscheit - Вы можете не помнить, но вы научили меня этому. На моей машине «по умолчанию» - 1252, потому что я добавил «host chcp 1252» в свой login.sql. Я написал эти заметки в OTN, объясняющие, как изменить кодовую страницу в пакетном файле ... сложнее, чем 'host chcp ....' – mathguy

+0

Вы правы, но я думаю, что стоит упомянуть, что по умолчанию кодовая страница SQL * Plus - это не CP1252 (хотя многие полагают, что), если только он не будет отличаться, как вы ловко сделали. –

 Смежные вопросы

  • Нет связанных вопросов^_^