Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / При вставке половина символов русской строки � / 25 сообщений из 57, страница 1 из 3
09.07.2020, 18:25
    #39977856
pwflamy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При вставке половина символов русской строки �
Добрый день!

При попытке вставить в поле CLOB строку русского текста, половина этой строки заменяется знаком вопроса �. Если же вставляем исходный json, то небольшая часть конца json дублируется, при этом все русские символы заменяются на этот знак �, а в дублированной части русские буквы отображаются нормально.

Пробовал использовать функцию convert при вставке. Если приводить к кодировке CL8ISO8859P5, то результат не меняется, если приводить к кодировке UTF8, то строка выводится нормально, но добавляется в конец строки некоторые символы. Например при вставке convert('привет', 'utf8') результат выглядит так: "приветаВаЕб☐"

NLS_CHARACTERSET = CL8ISO8859P5

С чем это может быть связано?
...
Рейтинг: 0 / 0
09.07.2020, 18:42
    #39977862
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При вставке половина символов русской строки �
Более непонятный текст придумать сложно

Можно для тупых объяснить, кто и что вставлял, куда и откуда, что нажимали для вставки Ctrl-C, Ctrl-V или Ctrl-Insert, Shift-Insert и так далее.
...
Рейтинг: 0 / 0
09.07.2020, 18:53
    #39977866
pwflamy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При вставке половина символов русской строки �
Leonid Kudryavtsev, В таблице есть поле типа CLOB. Вставляем текст запросом INSERT INTO. Для примера:

Код: plaintext
1.
2.
3.
INSERT INTO table 
(app) 
VALUES
('привет')

Результат: ���вет
Код: plaintext
1.
2.
3.
INSERT INTO table 
(app) 
VALUES
(convert('привет','utf8'))

Результат: приветаВаЕб☐
...
Рейтинг: 0 / 0
09.07.2020, 19:20
    #39977872
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При вставке половина символов русской строки �
pwflamyВставляем текст запросом INSERT INTO.

Ошибка в приложении. Жалуйтесь его автору.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
09.07.2020, 20:39
    #39977891
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При вставке половина символов русской строки �
pwflamy


NLS_CHARACTERSET = CL8ISO8859P5

?
мигрировать на уникод
...
Рейтинг: 0 / 0
09.07.2020, 20:44
    #39977892
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При вставке половина символов русской строки �
pwflamy

NLS_CHARACTERSET = CL8ISO8859P5

С чем это может быть связано?

- С некорректной настройкой клиента (NLS_LANG указывает кодировку, отличную от кодировки вставляемого текста)
- С неверно выбранной кодировкой БД (в выбранной кодировке БД невозможно представить символы кириллицы)
...
Рейтинг: 0 / 0
09.07.2020, 22:08
    #39977914
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При вставке половина символов русской строки �
andrey_anonymousв выбранной кодировке БД невозможно представить символы кириллицы

С чего бы? ISO 8859-5 не слишком распространённая, но всё же вполне кириллическая кодировка.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
09.07.2020, 22:20
    #39977919
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При вставке половина символов русской строки �
Там дохренища тонкостей, в общем и целом проще мигрировать на уникод и не мучаться..

tl;drCLOBs when using fixed width character set NLS_CHARACTERSET are stored in the NLS_CHARACTERSET character set on disk. Examples are WE8MSWIN1252 , AR8ISO8859P6 etc.

However , CLOB's (and NCLOB's) of varying-width character sets (ex: UTF8, AL32UTF8) are stored in an internal fixed-width Unicode character set on disk. When data is fetched from, or written to, disk storage, Oracle converts between the internal format and the database (CLOB) or the national character (NCLOB) set Oracle uses for the "external" (N)CLOB datatypes.

Note on loading CLOBs from files in varying-width character sets
In Oracle9.2 and later the programmatic interface DBMS_LOB.LOADFROMFILE() should not be used for loading files to CLOBs for varying-width character sets. Instead use the new programmatic interface DBMS_LOB.LOADCLOBFROMFILE().
...
Рейтинг: 0 / 0
10.07.2020, 09:48
    #39978006
pwflamy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При вставке половина символов русской строки �
andrey_anonymous
pwflamy

NLS_CHARACTERSET = CL8ISO8859P5

С чем это может быть связано?

- С некорректной настройкой клиента (NLS_LANG указывает кодировку, отличную от кодировки вставляемого текста)
- С неверно выбранной кодировкой БД (в выбранной кодировке БД невозможно представить символы кириллицы)

Вывод nls_database_parameters такой:
NLS_ISO_CURRENCY=AMERICA
NLS_LANGUAGE=AMERICAN

По поводу смены кодировки, наши базисты не хотят, так как по их словам придется пересоздавать базу
...
Рейтинг: 0 / 0
10.07.2020, 10:15
    #39978012
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При вставке половина символов русской строки �
Правильно не хотят
Если не работать со множеством языков одновременно, то юникод зло -- данные занимают больше места, обработка тормозней
А если нужны данные многих языков одновременно, но в небольшом количестве табличек -- можно воспользоваться N-типами

2ТС. На чем написан клиент? И какое значение переменной NLS_LANG на клиенте?
...
Рейтинг: 0 / 0
10.07.2020, 11:08
    #39978027
pwflamy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При вставке половина символов русской строки �
Вячеслав Любомудров, приложение, что общается с бд, написано на java. Используется thin oracle jdbc driver.
Кроме этого, для теста подключаюсь к бд через idea OracleDriver
...
Рейтинг: 0 / 0
10.07.2020, 12:17
    #39978072
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При вставке половина символов русской строки �
С большой долей вероятности (>90%) строки уже испорчены на стороне Java (в неправильной/не Java/ кодировке)
Разбирайтесь, где у Вас кривые строки и из-за чего они возникают
Учитесь пользоваться отладчиком или, как минимум, логированием/троссировкой в своем коде. Начиная от банального System.out.println до Log4j и до 100500 других способов поиска ошибки.

IMHO
...
Рейтинг: 0 / 0
10.07.2020, 12:32
    #39978080
pwflamy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При вставке половина символов русской строки �
Leonid Kudryavtsev,

Строка передается в формате UTF-8 и по логам передается валидной вплоть до передачи ее как аргумента в процедуру sql. Отладчик показывает такой же результат - строка нормально читается.
А вот если эту же строку попытаться считать сразу же после вставки в таблицу, то обратно она уже возвращается с символами �

Приложение работало нормально и передавало строки в UTF-8, однако после того как были изменены какие-то параметры со стороны базистов (а они очень занятые люди), начались эти проблемы. NLS_CHARACTERSET они как я понимаю не могли поменять, значит какие-то другие параметры изменились и повлияли на это.

Опять таки, выполняя просто запрос insert into через консоль idea, результат выходит таким же
...
Рейтинг: 0 / 0
10.07.2020, 12:51
    #39978087
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При вставке половина символов русской строки �
jdbc всегда работает в юникоде, насколько я знаю, поэтому никаких конвертаций там делать не нужно если данные не берутся из внешних источников, файлов, например

Не надо юзать какие-то левые тулзы, лучший и самый надежный клиент -- это родной sqlplus
Вот через него и проверяй вставку и чтение (установив NLS_LANG в соответсвии с кодовой страницей терминала)
...
Рейтинг: 0 / 0
10.07.2020, 13:01
    #39978095
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При вставке половина символов русской строки �
pwflamyОпять таки, выполняя просто запрос insert into через консоль idea, результат выходит таким же

А через SQL*Plus?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.07.2020, 13:27
    #39978109
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При вставке половина символов русской строки �
Делайте нормальный тест-кейс + тест на создание тест-таблицы + настройки с сервера
Выкладывайте в форум код и результат выполнения

Или "лукавит" Oracle или Вы )))

IMHO
...
Рейтинг: 0 / 0
10.07.2020, 14:13
    #39978139
pwflamy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При вставке половина символов русской строки �
Dimitry Sibiryakov,
Попробовал сейчас через Oracle SQL Developer (так как установить Sql *Plus не могу)
Выполнил запрос:
INSERT INTO table
(id, app)
VALUES
(200, 'привет')

Далее выполняю select через Oracle SQL Developer - результат в поле app: ☐☐☐☐☐☐
Select через IDEA выводит - ���вет


Таблица создавалась след образом:
create table table
(
id NUMBER NOT NULL,
app CLOB
)

Результат запроса select * from nls_database_parameters:
NLS_DATE_LANGUAGE = AMERICAN
NLS_NUMERIC_CHARACTERS = .,
NLS_NCHAR_CHARACTERSET = AL16UTF16
NLS_CHARACTERSET = CL8ISO8859P5
NLS_ISO_CURRENCY = AMERICA
NLS_CURRENCY = $
NLS_TERRITORY = AMERICA
NLS_LANGUAGE = AMERICAN

Результат запроса select * from nls_session_parameters:
NLS_LANGUAGE = AMERICAN
NLS_TERRITORY = CIS
NLS_CURRENCY = p.
NLS_ISO_CURRENCY = CIS
NLS_NUMERIC_CHARACTERS = ,

Если еще какие-то параметры нужны, которые можно вытащить запросом, то напишите
NLS_DATE_LANGUAGE = AMERICAN
...
Рейтинг: 0 / 0
10.07.2020, 14:17
    #39978143
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При вставке половина символов русской строки �
pwflamyустановить Sql *Plus не могу

Что мешает?

Обычно он уже установлен как часть Oracle Client.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.07.2020, 15:13
    #39978179
pwflamy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При вставке половина символов русской строки �
Dimitry Sibiryakov,

Политика безопасности, есть определенный список ПО, который можно устанавливать
...
Рейтинг: 0 / 0
10.07.2020, 15:25
    #39978189
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При вставке половина символов русской строки �
Оракул должен входить в этот список, ибо как вы с ним можете работать не устанавливая?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.07.2020, 15:28
    #39978191
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При вставке половина символов русской строки �
pwflamy
Строка передается в формате UTF-8 и по логам передается валидной вплоть до передачи ее как аргумента в процедуру sql.

1. Джава унутре без специальных ухищрений работает в unicode, а не в UTF8. (да-да, utf-8 - это НЕ unicode, как и utf-16, utf-32 - это лишь представление родных юникодных codepoints)
2. Попробуйте локализовать
Для контроля сделайте таблицу с двума атрибутами: varchar2 и clob, вставьте туда свой "привет".
2а. Попробуйте Nvarchar2, NClob.
2б. Enable/disable storage in row
3. select dump(<field>,1016) прояснит ситуацию с хранимыми байтами.
...
Рейтинг: 0 / 0
10.07.2020, 15:36
    #39978198
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При вставке половина символов русской строки &#65533;
andrey_anonymous
Попробуйте локализовать

IMHO сначала локализовать нужно в java
1) или распечатать коды символов которые лежат в String, что бы убедиться, что кодировка правильная
2) задать строку не в виде платформеннозависимого 'Привет', а в виде кодов \u
...
Рейтинг: 0 / 0
10.07.2020, 15:49
    #39978206
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При вставке половина символов русской строки &#65533;
Leonid Kudryavtsev,

ТС же сказал, что в sql developer проблема повторяется
...
Рейтинг: 0 / 0
10.07.2020, 15:56
    #39978211
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При вставке половина символов русской строки &#65533;
Проблема с одним Ява-клиентом повторяется в другом Ява-клиенте. Кто-то будет сомневаться в
её локализации?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.07.2020, 16:09
    #39978217
pwflamy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При вставке половина символов русской строки &#65533;
andrey_anonymous,

1) json, который передается в бд, создается с помощью Jackson ObjectMapper, который возвращает строку в UFT-8
2) попробую
3) select dump(app, 1016) from table - ошибка expected - got CLOB
select dump(to_char(app), 1016) - результат: Typ=1, Len=6, CharacterSet=CL8ISO8859P5: df, e0, d8, d2, d5, e2

Попробовал строку "привет" передать в формате "привет" - ���вет
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / При вставке половина символов русской строки &#65533; / 25 сообщений из 57, страница 1 из 3
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]