powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Не понимаю octet_length() для rpad('',N,utf8-строкой) при чарсете коннекта <> utf8
5 сообщений из 5, страница 1 из 1
Не понимаю octet_length() для rpad('',N,utf8-строкой) при чарсете коннекта <> utf8
    #38485318
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hi all.

test-1 . Чарсет консоли клиента: utf8, ось=линух.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
$ isql -ch utf8 localhost/3330:empty30
SQL> set list on;
SQL> select a.mon$character_set_id,r.rdb$character_set_name 
SQL> from mon$attachments a join rdb$character_sets r
SQL> on a.mon$character_set_id=r.rdb$character_set_id 
SQL> where a.mon$attachment_id=current_connection;

MON$CHARACTER_SET_ID            4
RDB$CHARACTER_SET_NAME          UTF8                                                                     

SQL> with c as(
CON>   select rpad('', 8, cast('абырвалг' as varchar(255) character set utf8)) s1,
CON>          cast('абырвалг' as varchar(8) character set utf8) s2
CON>   from rdb$database
CON> )
CON> select c.s1, octet_length(c.s1) o1, c.s2, octet_length(c.s2) o2
CON> from c;

S1                              абырвалг
O1                              16
S2                              абырвалг
O2                              16

Результат в полях `o1` и `o2` один и тот же, что выглядит вполне себе естественно.

test-2 . Чарсет консоли клиента: win1251, ось=виндуза (всё делаю в окне cmd.exe).

Код: 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.
C:\>chcp
Текущая кодовая страница: 866

C:\>chcp 1251
Текущая кодовая страница: 1251

C:\>isql 192.168.0.201/3330:empty30 -ch win1251
Database:  192.168.0.201/3330:empty30
SQL> set list on;
SQL> select a.mon$character_set_id,r.rdb$character_set_name 
SQL> from mon$attachments a join rdb$character_sets r 
SQL> on a.mon$character_set_id=r.rdb$character_set_id 
SQL> where a.mon$attachment_id=current_connection;

MON$CHARACTER_SET_ID            52
RDB$CHARACTER_SET_NAME          WIN1251

SQL> with c as(
CON>   select rpad('', 8, cast('абырвалг' as varchar(255) character set utf8)) s1,
CON>          cast('абырвалг' as varchar(8) character set utf8) s2
CON>   from rdb$database
CON> )
CON> select c.s1, octet_length(c.s1) o1, c.s2, octet_length(c.s2) o2
CON> from c;

S1                              абырвалг
 O1                              8 
S2                              абырвалг
O2                              16

Что случилось со значением в поле `o1` ? Почему число байтов в значении rpad() зависит от чарсета коннекта ?
...
Рейтинг: 0 / 0
Не понимаю octet_length() для rpad('',N,utf8-строкой) при чарсете коннекта <> utf8
    #38485332
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидПочему число байтов в значении rpad() зависит от чарсета коннекта ?

Потому что результат этой функции - в чарсете коннекта. Разве не очевидно?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Не понимаю octet_length() для rpad('',N,utf8-строкой) при чарсете коннекта <> utf8
    #38485341
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovрезультат этой функции - в чарсете коннекта. Разве не очевидно?..
Пока не очень сильно бросается в глаза... http://www.firebirdsql.org/refdocs/langrefupd25-intfunc-rpad.html RPAD()
Available in: DSQL, PSQL
Added in: 2.1
Changed in: 2.5 (backported to 2.1.4)
Description: Right-pads a string with spaces or with a user-supplied string until a given length is reached.
Result type: VARCHAR or BLOB http://firebirdsql.org/rlsnotesh/rlsnotes210.html OCTET_LENGTH( <string> | <string_expr> )
Returns the length of a string or expression result in bytes . здесь - тоже почитал, объяснения не вижу.
...
Рейтинг: 0 / 0
Не понимаю octet_length() для rpad('',N,utf8-строкой) при чарсете коннекта <> utf8
    #38485347
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидПока не очень сильно бросается в глаза...
А в каком ещё чарсете он должен быть?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Не понимаю octet_length() для rpad('',N,utf8-строкой) при чарсете коннекта <> utf8
    #38485354
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, стоп. кажись, понял. Он (xPad) приводит результат к чарсету первого аргумента :-)
Вот:
Код: sql
1.
2.
3.
4.
5.
6.
7.
with c as(
  select rpad( _win1251 '' , 8, 'абырвалг' ) s1
        ,rpad( _utf8 '' ,    8, 'абырвалг' ) s2
  from rdb$database
)
select '>'||c.s1||'<' s1x, octet_length(c.s1) o1, '>'||c.s2||'<' s2x, octet_length(c.s2) o2
from c;

S1XO1S2XO2>абырвалг<8>абырвалг<16
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Не понимаю octet_length() для rpad('',N,utf8-строкой) при чарсете коннекта <> utf8
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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