В чем основное отличие Varchar2 и char

Создание таблицы:

CREATE TABLE test (
charcol    CHAR(10),
varcharcol VARCHAR2(10));

SELECT LENGTH(charcol), LENGTH(varcharcol) FROM test;

Результат:

LENGTH(CHARCOL) LENGTH(VARCHARCOL)
--------------- ------------------
             10                  1 

Пожалуйста, дайте мне знать, в чем разница между Varchar2 и char? В какое время мы используем оба?

Ответ 1

Простой пример, чтобы показать разницу:

SELECT 
    '"'||CAST('abc' AS VARCHAR2(10))||'"', 
    '"'||CAST('abc' AS CHAR(10))||'"' 
FROM dual;


'"'||CAST('ABC'ASVARCHAR2(10))||'"' '"'||CAST('ABC'ASCHAR(10))||'"'
----------------------------------- -------------------------------
"abc"                               "abc       "                   
1 row selected.

CHAR полезен для выражений, где длина символов char всегда исправлена, например. почтовый индекс для штатов США, например CA, NY, FL, TX

Ответ 2

Это старый поток, но он просто наткнулся на поиск Google для "Oracle char vs varchar2", и хотя уже есть несколько ответов, правильно описывающих поведение char, я думаю, что это должно быть сказал, что вы не должны использовать его, кроме как в двух конкретных ситуациях:

  • Вы создаете файл или отчет фиксированной длины и присваиваете ненулевое значение char, избегая необходимости кодировать выражение rpad(). Например, если firstname и lastname оба определены как char(20), тогда firstname || lastname является более коротким способом записи rpad(firstname,20) || rpad(lastname,20).
  • Вам нужно различать явную пустую строку '' и null. Обычно они являются одними и теми же в Oracle, но присвоение '' значению char вызывает его поведение пустого заполнения, а null не будет, поэтому, если важно сказать разницу, и я не могу действительно думать по какой причине это было бы, тогда у вас есть способ сделать это.

Существует действительно нет причин использовать char только потому, что исправлена ​​некоторая длина (например, флаг Y/N или код валюты ISO, такой как 'USD'). Он не более эффективен, он не экономит место (нет индикатора длины мифа для varchar2, там просто пустые служебные накладные расходы для char), и это не мешает кому-либо вводить более короткие значения. (Если вы введете 'ZZ' в столбец валюты char(3), он просто будет сохранен как 'ZZ '.) Он даже не совместим с предыдущей версией Oracle, который когда-то полагался на нее, потому что ее никогда не было.

И заражение может распространяться, поскольку (следуя лучшей практике) вы можете привязать объявление переменной, используя что-то вроде sales.currency%type. Теперь ваша переменная l_currency является скрытой char, которая будет невидимо заполнена пробелом для более коротких значений (или ''), открывая дверь, чтобы затушевать ошибки, где l_currency не равно l_somethingelse, хотя вы назначили 'ZZ' для обоих из них.

char был введен в Oracle 6, я уверен, что причины совместимости ANSI. Вероятно, есть потенциальные клиенты, которые решают, какой продукт базы данных купить и совместимость ANSI находятся в их контрольном списке (или использовались тогда), а char с пустым заполнением определяется в стандарте ANSI, поэтому Oracle должен его предоставить. Вы не должны фактически использовать его.

Ответ 3

CHAR тип имеет фиксированный размер, поэтому, если вы говорите, что это 10 байт, он всегда хранит 10 байт в базе данных, и не имеет значения, сохраняете ли вы какой-либо текст или просто пустое 10 байт

Размер VARCHAR2 зависит от того, сколько байтов вы собираетесь хранить в базе данных. Указанный вами номер - это максимальное количество байтов, которое может быть сохранено (хотя минимум 1 байт)

Вы должны использовать CHAR при работе с строками фиксированной длины (вы заранее знаете точную длину строки, которую вы будете хранить) - база данных может работать с ней лучше и быстрее, поскольку она знает точную длину

Вы должны использовать VARCHAR2, когда вы не знаете точную длину сохраненных строк.

Ситуация, которую вы использовали бы, может быть:

name VARCHAR2(255),
zip_code CHAR(5) --if your users have only 5 place zip codes

Ответ 4

CHAR

CHAR следует использовать для хранения строк строки длины исправления. Значения строк будут заполнены пробелом/пробелом перед сохранением на диске. Если этот тип используется для хранения строк длины varibale, он будет тратить много дискового пространства.

VARCHAR2

VARCHAR2 используется для хранения строк символов переменной длины. Строковая длина будет сохранена на диске с самим значением.

И

At what times we use both?

Все зависит от вашего требования.

Ответ 5

CHAR используется для хранения символьных строк длины исправления. Это будет тратить много дискового пространства, если этот тип используется для хранения строк длины varibale.

VARCHAR2 используется для хранения строк символов переменной длины.

В какое время мы используем оба?

Это может зависеть от вашего требования.

EDIT: -

Позволяет понять это с помощью примера. Если у вас есть столбец имен учеников с размером 10; sname CHAR(10) и если значение столбца 'RAMA' вставлено, в правой части значения будет вставлено 6 пустых пространств. Если это столбец VARCHAR; sname VARCHAR2(10). Затем Varchar возьмет 4 пробела из 10 возможных и освободит следующие 6 для другого использования.

Ответ 6

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

Ссылка: https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:2668391900346844476

Так как a char - это не что иное, как VARCHAR2, который пуст заполнен к максимальной длине, т.е. разница между столбцами X и Y ниже:

создать таблицу t (x varchar2 (30), y char (30)); вставить в t (x, y) значения (rpad ('a', '', 30), 'a');

АБСОЛЮТНО НИЧЕГО, и учитывая, что разница между столбцами X и Y ниже:

вставить в значения t (x, y) ('a', 'a')

заключается в том, что X потребляет 3 байта (нулевой индикатор, длина ведущего байта, 1 байт для 'a'), а Y потребляет 32 байта (нулевой индикатор, ведущий байт длина, 30 байт для 'a')

Умм, varchar2 будет несколько "с преимуществом" мудрый ". Это не помогает нам во всем, что char (30) всегда 30 байт - для нас, это просто varchar2, который заполнен до максимума до максимума длина. Это помогает нам в обработке - ZERO, zilch, zippo.

В любое время, когда вы видите, что кто-то говорит" это на 50% быстрее ", и это все - нет примера, нет науки, нет фактов, нет истории, чтобы поддержать это - просто смеяться громко на них и продолжать двигаться вперед.

На этой странице также есть другие" составленные вещи ", например:

" Поиск быстрее в char, поскольку все строки хранятся на   заданной позиции друг от друга, системе не нужно   найдите конец строки. В то время как в VARCHAR система должна   сначала найдите конец строки, а затем идите для поиска. "

FALSE: a char - это просто пробел в varchar2 - мы не храним строки" в заданной позиции друг от друга". Мы ищем конец строки - мы используем длину ведущего байта для определения вещей из.