powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / ошибка после изменения дефолтного collation у чарсета
17 сообщений из 17, страница 1 из 1
ошибка после изменения дефолтного collation у чарсета
    #39027509
fb user
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE COLLATION WIN1251_NOPAD
FOR WIN1251
FROM WIN1251
NO PAD;

alter database set DEFAULT CHARACTER SET win1251;

alter character set WIN1251 set default collation WIN1251_NOPAD;


И даблклик на имени таблицы перестаёт работать. FB3.
...
Рейтинг: 0 / 0
ошибка после изменения дефолтного collation у чарсета
    #39030492
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ССЗБ.
...
Рейтинг: 0 / 0
ошибка после изменения дефолтного collation у чарсета
    #39030504
fb user
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpertССЗБ.
Толсто.
...
Рейтинг: 0 / 0
ошибка после изменения дефолтного collation у чарсета
    #39030673
fb user
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И после Extract Metadata в скрипте только генераторы и исключения. В 2.5.5 тоже.

Ваша программа работает некорректно, а вы почему-то в мой адрес применили аббревиатуру ССЗБ. Почему?
Спрашиваю, потому что не готов поверить в то что такую программу способен написать хам или тролль.
...
Рейтинг: 0 / 0
ошибка после изменения дефолтного collation у чарсета
    #39030730
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fb user,

ты в isql проверял? В том числе экспорт в скрипт.
Если там нет ошибок, то да ошибка в IBE.

P.S. На хрена потребовалось включать чувствительность к завершающим пробелам? Тем более по дефолту для всех полей чарсета win1251.
Я бы не назвал это ни хамством ни троллингом. Тебе ответили, что ты сам виноват только и всего.

И таки да. Ты в курсе что это должно адекватно работать только для вновь создаваемых объектов метаданных?
...
Рейтинг: 0 / 0
ошибка после изменения дефолтного collation у чарсета
    #39030767
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fb userВаша программа работает некорректно, а вы почему-то в мой адрес применили аббревиатуру ССЗБ. Почему?


Потому что ты должен отдавать себе отчет в последствиях подобных изменений. Работать не будет не только эксперт, но и большинство другого прикладного софта, потому что многие, в том числе очень простые и прозрачные запросы, возвращают несколько неожиданный, я бы сказал, результат.
Например

Код: plsql
1.
2.
select * from rdb$relations
where rdb$relation_name = 'RDB$FIELDS'



не вернет нифига.
...
Рейтинг: 0 / 0
ошибка после изменения дефолтного collation у чарсета
    #39030799
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fb user,

Если я правильно понял, то произошло следующее

У rdb$relation_name чарсет UNICODE_FSS для которого ничего не меняли. Однако литерал 'RDB$FIELDS' теперь сравнивается с учётом пробелов. Тип поля rdb$relation_name CHAR(31). Он дополняется пробелами до декларированной длинны. В итоге мы ни хрена не находим.

Ты думаешь нечувствительность к конечным пробелам по умолчанию от балды поставили?
...
Рейтинг: 0 / 0
ошибка после изменения дефолтного collation у чарсета
    #39031021
fb user
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpertПотому что ты должен отдавать себе отчет в последствиях подобных изменений. Работать не будет не только эксперт, но и большинство другого прикладного софта, потому что многие, в том числе очень простые и прозрачные запросы, возвращают несколько неожиданный, я бы сказал, результат.
Например

Код: plsql
1.
2.
select * from rdb$relations
where rdb$relation_name = 'RDB$FIELDS'



не вернет нифига.
Вот так понятно.
А если написать
Код: sql
1.
2.
select * from rdb$relations
where trim (trailing from rdb$relation_name) = 'RDB$FIELDS'

то индекс по rdb$relation_name не подтягивается.
Получается NO PAD если и юзабелен, то с граблями.

Придётся всегда держать в уме что сравнение строк неточное, и прикладывать усилия если нужно сравнивать прям побайтно.

Симонов Денис , это наверняка где-то в документации отражено, да? Я не про NO PAD, а про сравнения строк, что они сравниваются не абы как.
...
Рейтинг: 0 / 0
ошибка после изменения дефолтного collation у чарсета
    #39031058
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fb user,

читай CREATE COLLATION там это есть. Про косяки которые могут возникнуть с IBE и другими прогами там конечно не написано. Да и грубо говоря это не совсем косяк FB. PAD SPACE по умолчанию стоит потому что это по стандарту, ну и ИХМО так удобнее сравнивать CHAR с VARCHAR. Если где-то нужно другое поведение включаем такое поведение для этого филда. А включать сразу для всей кодировки опасно как оказалось.
...
Рейтинг: 0 / 0
ошибка после изменения дефолтного collation у чарсета
    #39031060
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fb user,

а ты про сравнение строк и то что там не учитываются завершающие пробелы? Надо посмотреть.
...
Рейтинг: 0 / 0
ошибка после изменения дефолтного collation у чарсета
    #39031064
fb user
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов ДенисТы думаешь нечувствительность к конечным пробелам по умолчанию от балды поставили?
Возможно это было сделано чтобы закрыть несуразность с типом CHAR. Если у нас тип поля CHAR(10), и в это поле записать значение 'самосвал', то реально в поле оказывается 'самосвал '. Это, согласитесь, несколько обескураживает, если столкнулся с SQL впервые. Ну и, скорей всего, чтобы не писать where F = 'самосвал ' и было придумано пробелы отбрасывать (сначала приделываем пробелы при вставке, честно храним их, а потом отбрасываем при сравнении). Потом скорей всего поняли что с типом CHAR так каши не сварить, и придумали VARCHAR, но отбрасывание концевых пробелов при сравнении так и осталось. И поэтому если в VARCHAR(20) записать 'самосвал ', то там будет 'самосвал ', но находить его можно как по 'самосвал ', так и по 'самосвал'.

Третье поколение строковых типов будет называться STRING, и будет работать очевидным для пользователей способом (так как сделала компания Борланд сначала для паскаля (короткие строки), а затем для Delphi (длинные строки с reference-count), но не успела так сделать для Interbase (или не захотела, или не смогла)). Пользователи стринги оценили. И если бы у стрингов в Delphi было сравнение с отбрасыванием пробелов (что бывает наверное только у sql-серверов), то это конечно было бы оценено как недоразумение.
...
Рейтинг: 0 / 0
ошибка после изменения дефолтного collation у чарсета
    #39031076
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fb user,

согласен про то, что сделано для сравнения CHAR без пробелов. В остальном нет.

Не знаю когда там появились VARCHAR, но скажу так — и тот и другой тип нужен. Просто надо понимать что CHAR лучше использовать для строк фиксированной длины. Есть такие данные где число введённых символов приблизительно одинаковое. Например номер телефона. В таких случаях использование CHAR предпочтительней. А там где оно сильно может разниться лучше использовать VARCHAR (например ФИО).

По какой причине в системных таблицах для объектов метаданных выбран тип CHAR я не знаю. Возможно это обусловлено историческими причинами, но теперь это так и вряд ли это будут переделывать.

Опять про стринги разговоры пошли. NickDee признавайся это ты?
...
Рейтинг: 0 / 0
ошибка после изменения дефолтного collation у чарсета
    #39031165
fb user
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов ДенисНапример номер телефона. В таких случаях использование CHAR предпочтительней.
В случае телефона +7(999)9999999, чем CHAR(14) лучше чем VARCHAR(14)?
И туда и туда можно вписать любую последовательность символов длиной до 14, хоть даже и не телефон. Только для CHAR при вычитке строка дополнится пробелами до 14 символов. А в VARCHAR будет столько символов, сколько записали, без самодеятельности.
CHAR единственно удобен тем, что паддить не нужно. Поля возвращаются с пробелами в конце. Но это нужно только тем, кому нужны пробелы в конце.
Ещё для каждого CHAR-значения на клиенте приходится делать TrimRight, чтобы вычленить полезные данные, что ресурсозатратно. С варчарами такого не нужно, т.к. известна длина полезных данных.
Если просто посмотреть что происходит с CHAR-значением за период его жизни, то получится что его постоянно паддят и триммят. Паддят при внесении в БД, триммят при сравнении и при извлечении полезных даных на клиенте. Варчары триммят только при сравнении, и нигде не паддят.
...
Рейтинг: 0 / 0
ошибка после изменения дефолтного collation у чарсета
    #39031218
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fb user...что бывает наверное только у sql-серверов...
Ты сильно ошибаешься. такое сравнение строк было задолго до sql
...
Рейтинг: 0 / 0
ошибка после изменения дефолтного collation у чарсета
    #39031223
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fb user,

да CHAR для строк постоянной длины более удобен. Ты в курсе что VARCHAR требует два дополнительных байта для хранения длины?
...
Рейтинг: 0 / 0
ошибка после изменения дефолтного collation у чарсета
    #39031379
fb user
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денисfb user,

да CHAR для строк постоянной длины более удобен. Ты в курсе что VARCHAR требует два дополнительных байта для хранения длины?
Ну если только с этой точки зрения смотреть.
Похоже системные таблицы Interbase были введены до появления типа VARCHAR.
Кстати такая капуста в новых системных таблицах с этими типами:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE SEC$USERS (
    SEC$USER_NAME    CHAR(31) CHARACTER SET UNICODE_FSS,
    SEC$FIRST_NAME   SEC$NAME_PART /* SEC$NAME_PART = VARCHAR(32) NOT NULL */,
    SEC$MIDDLE_NAME  SEC$NAME_PART /* SEC$NAME_PART = VARCHAR(32) NOT NULL */,
    SEC$LAST_NAME    SEC$NAME_PART /* SEC$NAME_PART = VARCHAR(32) NOT NULL */,
    SEC$ACTIVE       BOOLEAN,
    SEC$ADMIN        BOOLEAN,
    SEC$DESCRIPTION  BLOB SUB_TYPE 1 SEGMENT SIZE 80 CHARACTER SET UNICODE_FSS,
    SEC$PLUGIN       CHAR(31) CHARACTER SET UNICODE_FSS
);


ФИО - это конечно шедевр :) Кому-то нужно почитать: про отчества .
Я у себя сначала тоже имел FIO на три поля. Потом понял что хочу иметь просто длинный Name, чтобы туда можно было вписать удобный пользователю вариант (а не как удобно моим устаревшим шаблонам мышления):
---------------------
Иванов Иван Иванович
Иванов И.И.
София Елена Беатриса Французская
У́го Рафаэ́ль Ча́вес Фри́ас
---------------------
А поле UserName переименовалось в Login.

SEC$PLUGIN CHAR(31) CHARACTER SET UNICODE_FSS - 31 символ? Опять? И снова UNICODE_FSS? И во славу чьих-то шаблонов мышления там тот же CHAR.
...
Рейтинг: 0 / 0
ошибка после изменения дефолтного collation у чарсета
    #39031405
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fb user,

Не стоит забывать что для CHAR память выделяется один раз и сразу. Просто оставшаяся длина инициализируется пробелами. Оно во многих случаях дешевле. С VARCHAR удобней производить конкатенацию, т.к. не надо задумываться об обрезании пробелов.

Про ФИО.
Я вообще считаю что эти поля здесь не обязательны. Во-первых есть COMMENT для пользователей куда ты хоть целое сочинение можешь написать. Во-вторых есть пользовательские свойства (TAGS), куда можно до 255 символов текста вносить. В-третьих ты можешь создать свою таблицу и завязаться на имя логина и пихать туда что угодно в удобном для себя формате.

Про поле PLUGIN ты судя по всему вообще ничего не понял.
И почему оно должно иметь другую кодировку. Я уже говорил если менять кодировку метаданных, то у всего и сразу. Да UTF-8 был бы предпочтительней, но там без увеличения длины поля не обойтись, а это потянет за собой кучу других переделок. Да и придётся в ресторе снова делать -fix_metadata utf8. Жаль конечно что текст исключения обделили и оставили у него NONE.

И вообще твои выпады какие-то не серьёзные. Не там ты видишь проблемы. Не там.
Поверь большинству пользователей начхать на бесконечные строки и на названия объектов метаданных в национальной кодировке. Их волнуют прежде всего производительность, безопасность, надёжность и языковые возможности. Можно для интереса тему замутить "Что вы хотите видеть в Firebird 4?". Как-то была тут подобная много лет назад. Сразу будет видно приоритет твоих хотелок и что реально хочется большинству.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / ошибка после изменения дефолтного collation у чарсета
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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