почему этот запрос добавил дополнительную длину upper(trim(LEFT(col_name::varchar, 100)))

#sql #vertica

#sql #vertica

Вопрос:

 select
    distinct upper(trim(LEFT(col_name::varchar, 100))) as col_name from mytable;
  

Каким-то образом это добавило дополнительную длину, поскольку LEFT(col_name::varchar, 100) возвращает 100 символов слева.

И я получаю ошибку ниже при вставке в другую таблицу

ОШИБКА: строка из 101 октета слишком длинная для типа Varchar(100), если кто-нибудь может помочь мне понять это поведение

Ответ №1:

Функция LEFT(string, N) возвращает N символов с левой стороны строки.

Однако эти N символов могут занимать более N байт (октетов), например, символы с ударением:

 dbadmin=> select left('é', 1);
 left
------
 é

dbadmin=> select octet_length(left('é', 1));
 octet_length
--------------
            2