Как исправить кодировку символов в SQL-запросе - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть база данных db2, где я храню имена, содержащие специальные символы. Когда я пытаюсь получить их с помощью внутреннего программного обеспечения, я получаю правильные результаты. Однако когда я попытался сделать то же самое с запросами или заглянуть в БД, символы хранятся странным образом.

В документации сказано, что кодировка - utf-8 latin1. Мой запрос выглядит примерно так:

SELECT firstn, lastn
FROM unams
WHERE unamid = 12345

Пользователь с указанным идентификатором имеет несколько специальных символов в своем имени: é и - , но запрос возвращает его как Ă © и AL .

Есть ли способ преобразовать символы обратно в исходную форму с помощью какой-нибудь простой функции SQL? Я новичок в базах данных и кодировании, пытаясь понять последнее, прочитав this , но я совершенно растерялся.

РЕДАКТИРОВАТЬ: В настоящее время отправка запросов через SPSS Modeler с соответствующим драйвером ODBC, база данных находится на Windows Server 2016

Ответы [ 2 ]

1 голос
/ 25 апреля 2019

Согласно комментариям, решение состояло в том, чтобы создать переменную среды Windows DB2CODEPAGE = 1208, затем перезапустить, затем отбросить и заново заполнить таблицы.

Если приложения работают локально на Db2-сервере (т.е.задействовано только одно имя хоста), тогда можно задать ту же переменную.Это повлияет на все локальные приложения, использующие базу данных в кодировке UTF-8.

Если приложение запускается удаленно с Db2-сервера (т.е. задействованы два имени хоста), тогда установите переменную на рабочей станции и в Windows Db2.-server.

Текущие версии поставляемых IBM Db2-клиентов для Windows получают свою кодовую страницу из региональных настроек, которые могут не всегда корректно отображать символы Юникода, поэтому использование DB2CODEPAGE = 1208 приводит к принудительномуДрайверы CLI Db2-клиента для использования кодовой страницы приложения Unicode для переопределения этого.

0 голосов
/ 24 апреля 2019
with t (firstn) as (
values ('éó')
--SELECT firstn
--FROM unams
--WHERE unamid = 12345
)
select x.c, hex(x.c) c_hes
from 
  t
, xmltable('for $id in (1 to string-length($s)) return <i>{substring($s, $id, 1)}</i>' 
passing t.firstn as "s" columns tok varchar(6) path '.') x(c);

C C_HEX
- -----
é C3A9
ó C3B3

Приведенный выше запрос преобразует строку символов в таблицу с каждым символом (C) и его шестнадцатеричным представлением (C_HEX) в каждой строке.
Вы можете запустить его как есть, чтобы проверить,вы получаете тот же результат.Оно должно быть таким, как описано для базы данных UTF-8.
Теперь попробуйте закомментировать строку с values ('éó') и раскомментируйте оператор select, возвращая некоторую строку с этими специальными символами.

Если вы видите одинаковое шестнадцатеричное представление этих символов, хранящееся в столбце firstn, это означает, что строка хранится надлежащим образом, но ваш клиентский инструмент (SPSS Modeller) не может правильно отображать эти символыпо какой-то причине (например, неправильный шрифт).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...