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

При работе с 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
03.12.2010, 11:13
    #36992791
Tshind
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
order by и upper в DB2 for z/os по-русски
нашла у себя старые заметки про сортировку, когда работала еще с 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
03.12.2010, 12:35
    #36993101
Восход
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
order by и upper в DB2 for z/os по-русски
Здравствуйте.

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

Какая у вас версия 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
03.12.2010, 15:06
    #36993643
Восход
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
order by и upper в DB2 for z/os по-русски
Здравствуйте, Евгений Хабаров.
Спасибо Вам за ответ.

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
03.12.2010, 16:04
    #36993839
ппм
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
order by и upper в DB2 for z/os по-русски
Восход,

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

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

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

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


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