powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / order by и upper в DB2 for z/os по-русски
13 сообщений из 13, страница 1 из 1
order by и upper в DB2 for z/os по-русски
    #36992321
Восход
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

При работе с DB2 for z/os столкнулись со следующими двумя проблемами.

Первая.
1. Создаём таблицу TEST со строкой VALUE, кодировку таблицы выбираем UNICODE (utf8).
2. Добавляем туда строки, содержащие русские буквы.
3. При вызове
Код: plaintext
select * from TEST order by VALUE
буква Ё идёт первой по алфавиту.
Если же кодировку таблицы выбрать EBCDIC, сортировка вообще будет происходить по непонятному принципу.

Вторая.
1. Создаём таблицу TEST со строкой VALUE, кодировку таблицы выбираем UNICODE (что впрочем роли не играет).
2. Наполняем таблицу различными строками вида "Заглавная".
3. При вызове
Код: plaintext
select upper(VALUE) from TEST
функция upper для русских букв не работает.

На DB2 для AIX всё работает правильно. С английскими буквами всё работает правильно.

Подозреваю, что проблема может быть общая, поэтому размещаю в одном посте.

Может быть, кто-то сталкивался с подобным или хотя бы понимает, куда нужно копнуть?
...
Рейтинг: 0 / 0
order by и upper в DB2 for z/os по-русски
    #36992791
Tshind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
нашла у себя старые заметки про сортировку, когда работала еще с SQL/DS, может пригодиться?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
Пример сортировки символьных полей     

Для таблицы ASK.STREETS с нижеперечисленными полями:

CNAME         TNAME    CREATOR COLNO    COLTYPE     SYSLENGTH SYSLEN  NUL  REMARKS       
--------     --------    ------  ---  --------       -------  ------ ---  --------------
SERVICE     STREETS      ASK      1    SMALLINT                   2   N    KOД PAЙОНА 
STREET      STREETS      ASK      2    SMALLINT                   2   N    KOД УЛИЦЫ     
NAME        STREETS      ASK      3    VARCHAR           30       30  N    HAИMEHOBAHИE УЛИЦЫ
TYPE        STREETS      ASK      4    VARCHAR           15       15  N    TИП УЛИЦЫ     
UPDATED     STREETS      ASK      5    DATE                       4   N    ДATA OБHOBЛEHИЯ
OPERATOR    STREETS      ASK      6    SMALLINT                   2   N    KOД OПEPATOPA 

с помощью искусственного приема делается сортировка по полю NAME, литеры которого содержат русские и английские буквы вперемежку.
В данном примере заполняется стек для последующего вызова ISQL.
При выдаче оператора SELECT искусственно создается 7 колонка с пере-кодированными в нужном порядке литерами. Иформация сортируется по этой 7 колонке. Перед выдачей информации на печать колонка 7 удаляется.
При использовании ф-ции TRANSLATE(string, to_string, from_string) поле to_string 
“ '.<(+&abcdefghijklmnopqrstuvwxyz01<+nbjgikmor<+nbjgikmor-"        
"<(+&abcdefghijklmnopqrstuvwxyz01'“
определяется следующим образом: из перечня всех доступных кодов SQL    
выбираются коды литер по возрастанию кода, которому ставится в соответст-вие код литеры из поля from_string в том порядке, в котором мы хотим ви-деть порядок следования кодов литер, например: 
русской “А”, английской “а”, английской “А”, русской “а”   соответствует код литеры “<“ , т.е. все буквы “A”, “a” имеют вес кода литеры “<“ .

 
00653 QUEUE "SELECT SERVICE,STREET,NAME,TYPE,UPDATED,OPERATOR,- "               
00654 QUEUE " TRANSLATE(NAME,-                            "                     
00655 QUEUE " '.<(+&abcdefghijklmnopqrstuvwxyz01<+nbjgikmor<+nbjgikmor-"        
00656 QUEUE "<(+&abcdefghijklmnopqrstuvwxyz01',-"                             
00657 QUEUE " '_АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯabcehkmoptxABCEHKMOPTX-"        
00658 QUEUE "абвгдежзийклмнопрстуфхцчшщыъьэюя') -"                            
00659 QUEUE "FROM ASKRM.STREETS ORDER BY 7,4,1        "                         
00660 QUEUE "FORMAT TTITLE 'KAPTOTEKA УЛИЦ    '       "                         
00661 QUEUE "FORMAT COL 1 NAME 'P/C (SERVICE)'        "                         
00662 QUEUE "FORMAT COL 2 NAME 'KOД УЛ.(STREET)'      "                         
00663 QUEUE "FORMAT COL 3 NAME 'HAИMEHOBAHИE (NAME)' VARCHAR 30  "              
00664 QUEUE "FORMAT COL 4 NAME 'TИП (TYPE)' WIDTH 10  "                         
00665 QUEUE "FORMAT COL 5 NAME 'ДATA OБHOBЛ.(UPDATED)'"                         
00666 QUEUE "FORMAT COL 6 NAME 'OПEPATOP (OPERATOR)'  "                         
00667 QUEUE "FORMAT EXCLUDE 7                         "                         
00668 QUEUE "PRINT                                    "                         
00669 QUEUE "END                                      "             

 Аналогичным образом можно сортировать все символьные поля или их группы с индивидуально подбираемыми полями to_string, from_string,где эти поля литер и их весов (взяты из системных таблиц БД) могут быть или длинней или короче указанных в данном примере в зависимости от необходимых критериев сортировки
...
Рейтинг: 0 / 0
order by и upper в DB2 for z/os по-русски
    #36993101
Восход
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

Спасибо Вам за ответ. К сожалению, боюсь, что для нас такой способ будет не применим, так как мы используем ORM-слой (Hibernate) для работы с DB2.
...
Рейтинг: 0 / 0
order by и upper в DB2 for z/os по-русски
    #36993325
Восход,

Какая у вас версия DB2 for z/OS ?

Для версии 8 сортировка символьных данных производится "тупо" по байт-представлению для кодировки.
Поэтому для ASCII и Unicode оно почти совпадает с алфавитом (кроме ё и Ё), а для EBCDIC - нет, т.к. в EBCDIC коды символов расположены не в алфавитном порядке.

Однако UPPER и LOWER должны работать корректно. Что вернет такая выборка (имя таблицы и столбца нужно заменить своими) :
Код: plaintext
1.
select current lc_ctype from sysibm.sysdummy1;
select username,upper(username),lower(username),upper(lower(username)) from users order by cast(username as varchar( 30 ) ccsid ascii)

Для версии 9 есть функция COLLATION_KEY . На практике ее не пробовал, и смогу попробовать не раньше понедельника.
...
Рейтинг: 0 / 0
order by и upper в DB2 for z/os по-русски
    #36993643
Восход
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, Евгений Хабаров.
Спасибо Вам за ответ.

1-й запрос возвращает пустую строку из 51 символа.

2-й запрос вида
Код: plaintext
select VALUE,upper(VALUE),lower(VALUE),upper(lower(VALUE)) from UT order by cast(VALUE as varchar( 30 ) ccsid ascii)
возвращает:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
VALUE  2   3   4 
Test  TEST  test  TEST
Ё Ё Ё Ё
ё ё ё ё
А А А А
Б Б Б Б
Й Й Й Й
Тест  Тест  Тест  Тест
Ю Ю Ю Ю
Я Я Я Я
а а а а
й й й й
ю ю ю ю
я я я я

То есть - никакого эффекта.

Версия DB2 - 9.1.5.
...
Рейтинг: 0 / 0
order by и upper в DB2 for z/os по-русски
    #36993839
ппм
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Восход,

для UTF должен работать COLLATION_KEY, для EBCDIC можно сгондобить вот такую вот FIELD PROC
Поправить её только для русско-язычной кодировки.
Вообще, это же не недостатки, а сплошные достониства.
1. Таблица кодировки лежит в таблице системного каталога.
2. Правила сортировки можно реализовать через FIELD PROC
В результате, если завтра, к примеру, правительство наконец примет символ национальной валюты рубля, то все будут ждать, пока вендоры реализуют, а тут просто меняем таблицу кодировки, меняем правила сортировки, и всё.
...
Рейтинг: 0 / 0
order by и upper в DB2 for z/os по-русски
    #36993849
ппм
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
странно, не могу файл присоединить... С исходным кодом процедурки...
во зараза...
ну не судьба значит
...
Рейтинг: 0 / 0
order by и upper в DB2 for z/os по-русски
    #36993851
ппм
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ага, получилось
...
Рейтинг: 0 / 0
order by и upper в DB2 for z/os по-русски
    #36996553
Восход,

Чтобы работал UPPER/LOWER регистр LC_CTYPE должен содержать правильную локаль.
Локаль по умолчанию выставляется в модуле параметров DSNZPARM, параметр LC_CTYPE.
Динамически значение параметра можно выставить так:
Код: plaintext
SET CURRENT LC_CTYPE='RU_RU'
После чего еще раз выполнить запрос с UPPER/LOWER.
...
Рейтинг: 0 / 0
order by и upper в DB2 for z/os по-русски
    #37002229
ппм
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Евгений Хабаров,

только букву 'ё' неправильно сортирует, ставит её в начале перед 'а'
...
Рейтинг: 0 / 0
order by и upper в DB2 for z/os по-русски
    #37002420
ппм,

Цитирую себя же : Евгений ХабаровДля версии 8 сортировка символьных данных производится "тупо" по байт-представлению для кодировки. Поэтому для ASCII и Unicode оно почти совпадает с алфавитом (кроме ё и Ё). То что "ё" и "Ё" в ASCII-кодировке идет перед "а" и "А" - это исторически сложившееся явление.
...
Рейтинг: 0 / 0
order by и upper в DB2 for z/os по-русски
    #37003269
ппм
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
хм.
у меня ёбсдик, а не ascii
если я правильно помню
...
Рейтинг: 0 / 0
order by и upper в DB2 for z/os по-русски
    #37003270
ппм
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да и версия у меня 9.1
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / order by и upper в DB2 for z/os по-русски
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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