Я столкнулся с непредвиденной ситуацией, которую я не мог понять. Кроме того, документация о функциях, о которых я буду писать, может что-то осветить.
У меня есть таблица с полем titulo varchar2(55)
. Я в Бразилии, у некоторых персонажей в этом поле есть акценты, и моя цель - создать подобное поле без акцентов (заменено оригинальным персонажем, так как этот á
стал a
и т.д.).
Я мог бы использовать кучу функций, чтобы сделать это как replace
, translate
и другие, но я нахожу по Интернету то, что швы, чтобы быть более изящными, тогда я использую его. Именно там возникла проблема.
Мой код обновления похож:
update myTable
set TITULO_URL = replace(
utl_raw.cast_to_varchar2(
nlssort(titulo, 'nls_sort=binary_ai')
)
,' ','_');
Как я сказал, целью является преобразование каждого акцентированного символа в его эквиваленте без акцента плюс символ пробела для _
Затем я получил эту ошибку:
ORA-12899: value too large for column
"mySchem"."myTable"."TITULO_URL" (actual: 56, maximum: 55)
И сначала я, хотя, возможно, эти функции добавляют некоторый символ, позвольте мне проверить. Я сделал команду select, чтобы получить строку, где titulo
имеет 55 символов.
select titulo from myTable where length(titulo) = 55
Затем я выбираю строку для выполнения некоторых тестов, строка, которую я выбираю, имеет это значение: 'FGHJTÓRYO DE YHJKS DA DGHQÇÃA DE ASGA XCVBGL EASDEÔNASD'
(я изменил бит, чтобы сохранить данные, но результат тот же)
Когда я делаю следующий оператор select, что вещи стали странными:
select a, length(a), b, length(b)
from ( select 'FGHJTÓRYO DE YHJKS DA DGHQÇÃA DE ASGA XCVBGL EASDEÔNASD' a,
replace(
utl_raw.cast_to_varchar2(
nlssort('FGHJTÓRYO DE YHJKS DA DGHQÇÃA DE ASGA XCVBGL EASDEÔNASD', 'nls_sort=binary_ai')
)
,' ','_') b
from dual
)
Результат для этого sql (я поставил значения один за другим для лучшей визуализации):
a LENGTH(a)
FGHJTÓRYO DE YHJKS DA DGHQÇÃA DE ASGA XCVBGL EASDEÔNASD 55
b LENGTH(b)
fghjtoryo_de_yhjks_da_dghqcaa_de_asga_xcvbgl_easdeonasd 56
Сравнение двух строк один над другим не имеет разницы в размере:
FGHJTÓRYO DE YHJKS DA DGHQÇÃA DE ASGA XCVBGL EASDEÔNASD
fghjtoryo_de_yhjks_da_dghqcaa_de_asga_xcvbgl_easdeonasd
Я тестировал этот запрос на Toad, PLSQL Developer и SQLPLUSW с одинаковым результатом. Поэтому мой вопрос Где эта ДЛИНА (b) = 56 появилась от? Я знаю, что это может быть что-то с набором символов, но я не мог понять, почему. Я даже тестировал команду trim
, и результат тот же.
Другие тесты, которые я сделал
-
substr(b, 1,55)
результат был тем же самым текстом, что и выше -
lenght(trim(b))
результат был 56 -
substr(b,56)
результат был пустым (без пустого, без пробела, просто пустым)
Предлагается @Sebas:
-
LENGTHB(b)
результат был 56 -
ASCII(substr(b,56))
Итак, снова: Где эта ДЛИНА (b) = 56 появилась от?
Извините за длинный пост и благодарю вас за тех, кто здесь (прочитайте все). Спасибо тем, кто еще не читал:)
С наилучшими пожеланиями