|
Подскажите, с каких пор печатный ASCII символ 'SPACE' стал непечатным 'NUL'?
|
|||
---|---|---|---|
#18+
Следующая строка выводит запись со integer значением = 0. Код: plsql 1.
(кодировка базы UTF-8) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2022, 18:37 |
|
Подскажите, с каких пор печатный ASCII символ 'SPACE' стал непечатным 'NUL'?
|
|||
---|---|---|---|
#18+
rdb_dev, Код: sql 1.
:) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2022, 18:54 |
|
Подскажите, с каких пор печатный ASCII символ 'SPACE' стал непечатным 'NUL'?
|
|||
---|---|---|---|
#18+
rdb_dev Следующая строка выводит запись со integer значением = 0. Код: plsql 1.
(кодировка базы UTF-8) потому что ' '::char=''; т.е при приведении к char(N) типу оконечные пробелы удаляются по стандарту и далее вы делаете acsii('') - который выдаёт 0 Ну или подробнее Код: sql 1. 2. 3. 4.
сначала ' 5678' обрезаем до 1го символа ' ' а потом смотрим что это пробел и по правилам работы char() типов его превращаем в пустую строку. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2022, 22:58 |
|
Подскажите, с каких пор печатный ASCII символ 'SPACE' стал непечатным 'NUL'?
|
|||
---|---|---|---|
#18+
Maxim Boguk потому что ' '::char=''; т.е при приведении к char(N) типу оконечные пробелы удаляются по стандарту и далее вы делаете acsii('') - который выдаёт 0 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2022, 09:39 |
|
Подскажите, с каких пор печатный ASCII символ 'SPACE' стал непечатным 'NUL'?
|
|||
---|---|---|---|
#18+
Ещё вопрос - можно ли переменной типа VARCHAR указать кодировку хранения (CHARACTER SET)? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2022, 09:46 |
|
Подскажите, с каких пор печатный ASCII символ 'SPACE' стал непечатным 'NUL'?
|
|||
---|---|---|---|
#18+
rdb_dev Maxim Boguk потому что ' '::char=''; т.е при приведении к char(N) типу оконечные пробелы удаляются по стандарту и далее вы делаете acsii('') - который выдаёт 0 По итогам разбора как оно работает выяснилось что всё несколько сложнее... ' '::char(1) - вполне валидная штука... НО далее срабатывает следующий механизм из https://www.postgresql.org/docs/14/functions-string.html " Except where noted, these functions and operators are declared to accept and return type text. They will interchangeably accept character varying arguments. Values of type character will be converted to text before the function or operator is applied, resulting in stripping any trailing spaces in the character value." А функция ascii ( text ) → integer как раз принимает текст... и обрезает trailing он же единственный пробел в char(1) типе. Рекомендация - char(N) не использовать вообще никогда и нигде, это наследие 1970 и ранее годов с текстовыми терминалами. PS: а ещё есть тонкая разница между типом char и типом "char", но это уже внутренние потроха базы хотя если сильно постараться можно и на них попасть https://www.postgresql.org/docs/14/datatype-character.html#DATATYPE-CHARACTER-SPECIAL-TABLE Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
-- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2022, 14:09 |
|
Подскажите, с каких пор печатный ASCII символ 'SPACE' стал непечатным 'NUL'?
|
|||
---|---|---|---|
#18+
rdb_dev Ещё вопрос - можно ли переменной типа VARCHAR указать кодировку хранения (CHARACTER SET)? Нет... ENCODING задаётся при создании базы и не может быть разный в разных полях базы. Что в общем не мешает произвольные бинарные данные в bytea полях хранить если очень надо. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2022, 14:13 |
|
Подскажите, с каких пор печатный ASCII символ 'SPACE' стал непечатным 'NUL'?
|
|||
---|---|---|---|
#18+
Maxim Boguk А функция ascii ( text ) → integer как раз принимает текст... и обрезает trailing он же единственный пробел в char(1) типе. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2022, 14:23 |
|
Подскажите, с каких пор печатный ASCII символ 'SPACE' стал непечатным 'NUL'?
|
|||
---|---|---|---|
#18+
rdb_dev Maxim Boguk А функция ascii ( text ) → integer как раз принимает текст... и обрезает trailing он же единственный пробел в char(1) типе. Потому что она должна делать только то что в документации описано. А описано там следующее: ascii ( text ) → integer Returns the numeric code of the first character of the argument. In UTF8 encoding, returns the Unicode code point of the character. In other multibyte encodings, the argument must be an ASCII character. ascii('x') → 120 Если такой вариант вас не устраивает можете свою версию ascii с нужным вам поведением. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2022, 15:37 |
|
Подскажите, с каких пор печатный ASCII символ 'SPACE' стал непечатным 'NUL'?
|
|||
---|---|---|---|
#18+
Maxim Boguk, забавно!... Но не понятно - какое отношение многобайтные последовательности кодировки UNICODE имеют к ASCII? Почему нельзя было сделать их конвертацию в что-то типа CHAR(1) COLLATE "ASCII" и использовать это в качестве параметра функции ascii(), а для UNICODE последовательностей использовать иное имя функции, что было бы разумней и корректней? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2022, 15:43 |
|
Подскажите, с каких пор печатный ASCII символ 'SPACE' стал непечатным 'NUL'?
|
|||
---|---|---|---|
#18+
rdb_dev Почему нельзя было сделать их конвертацию в что-то типа CHAR(1) COLLATE "ASCII" и использовать это в качестве параметра функции ascii(), а для UNICODE последовательностей использовать иное имя функции, что было бы разумней и корректней? Да судя по тому, что расположена реализация функции в весьма намекающем ./src/backend/utils/adt/oracle_compat.c - я предполагаю, что о разумности или корректности речи вовсе не было. А делали с вполне конкретной целью уже заданных извне сигнатур функций, как указано в коммите , "Implement ascii(text), ichar(int4), repeat(text,int4) to help support the ODBC driver". При том свыше 20 лет назад и с тех пор по сути это больше не трогали. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2022, 16:02 |
|
Подскажите, с каких пор печатный ASCII символ 'SPACE' стал непечатным 'NUL'?
|
|||
---|---|---|---|
#18+
Проблемы с обрезанием CHAR и потерей пробелов есть и в Oracle (сам с таким боролся в Oracle Forms). Тут поддержу Maxim Boguk, если явно используются "устаревшие" ANSI типы данных, то нужно быть готовым нарваться на грабли. Но не понятно - какое отношение многобайтные последовательности кодировки UNICODE имеют к ASCII? Почему нельзя было сделать их конвертацию в что-то типа CHAR(1) COLLATE "ASCII" и использовать это в качестве параметра функции ascii(), а для UNICODE последовательностей использовать иное имя функции, что было бы разумней и корректней? Я как-то ответ Максима понял по другому. Проблема НЕ в Unicode, а в Char. Точнее в преобразовании Char -> Text, при которой удаляются концевые пробелы (а если вся строка один большой пробел, то все пробелы). Работайте в Text, и проблем не будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2022, 16:16 |
|
Подскажите, с каких пор печатный ASCII символ 'SPACE' стал непечатным 'NUL'?
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev Я как-то ответ Максима понял по другому. Проблема НЕ в Unicode, а в Char. Точнее в преобразовании Char -> Text, при которой удаляются концевые пробелы (а если вся строка один большой пробел, то все пробелы). ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2022, 10:08 |
|
Подскажите, с каких пор печатный ASCII символ 'SPACE' стал непечатным 'NUL'?
|
|||
---|---|---|---|
#18+
rdb_dev Leonid Kudryavtsev Я как-то ответ Максима понял по другому. Проблема НЕ в Unicode, а в Char. Точнее в преобразовании Char -> Text, при которой удаляются концевые пробелы (а если вся строка один большой пробел, то все пробелы). При этом я согласен с тем что по сути это поведение таки является багом... но я очень сомневаюсь что это будет кем то и когда либо исправлено (вылечить можно создав отдельную копию ascii фунции принимающую char тип на входе). Место всем этим oracle compat функциям - в отдельном расширении а не в ядре базы. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2022, 16:06 |
|
|
start [/forum/topic.php?fid=53&gotonew=1&tid=1993661]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
26ms |
get topic data: |
11ms |
get first new msg: |
6ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 144ms |
0 / 0 |