В зависимости от вашего набора символов, CHAR (1 байт) может не сохранять какой-либо конкретный символ, поэтому могут быть различия между VARCHAR2 (2000 байт) и CHAR (1 байт), если мы говорим о многобайтовом символы.
В целом, в SQL (правила PL / SQL немного отличаются) VARCHAR2 (2000 байт) не будет занимать больше памяти, чем CHAR (1 байт), если вы храните только 1 байт данных ( Я предполагаю, что «эффективный» переводится в первую очередь на эффективность хранения). VARCHAR2 (2000 байт) часто приводит к тому, что клиентское приложение выделяет 2000-байтовый буфер для хранения содержимого поля, поскольку клиентское приложение заранее не знает фактический размер данных, что может привести к чрезмерному использованию клиентским приложением количество оперативной памяти Это может или не может привести к реальной проблеме, хотя. Большинство клиентских приложений не вредит оперативной памяти, и большинство результирующих наборов не возвращают клиенту миллионы строк, поэтому тратить пару k на пару сотен строк может не иметь большого значения.
Существует поток AskTom , который более детально раскрывается, особенно в отношении правил PL / SQL.