В чем основная разница между 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? В какое время мы используем оба?

18 голосов | спросил ram12393 6 FriEurope/Moscow2013-12-06T10:51:43+04:00Europe/Moscow12bEurope/MoscowFri, 06 Dec 2013 10:51:43 +0400 2013, 10:51:43

6 ответов


0

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

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 полезен для выражений, в которых длина символов всегда фиксирована, например, почтовый индекс штатов США, например, CA, NY, FL, TX

ответил Wernfried Domscheit 6 FriEurope/Moscow2013-12-06T11:57:00+04:00Europe/Moscow12bEurope/MoscowFri, 06 Dec 2013 11:57:00 +0400 2013, 11:57:00
0

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

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

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

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

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

ответил William Robertson 10 FebruaryEurope/MoscowbFri, 10 Feb 2017 20:48:42 +0300000000pmFri, 10 Feb 2017 20:48:42 +030017 2017, 20:48:42
0
Тип

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

Размер

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

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

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

Ситуация, в которой вы могли бы использовать оба варианта:

name VARCHAR2(255),
zip_code CHAR(5) --if your users have only 5 place zip codes
ответил Wolf 6 FriEurope/Moscow2013-12-06T10:58:23+04:00Europe/Moscow12bEurope/MoscowFri, 06 Dec 2013 10:58:23 +0400 2013, 10:58:23
0

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

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

  

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

     

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

     

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

     

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

     

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

     

Хм, varchar2 будет несколько "с преимуществом производительности   мудрый ". Это помогает нам НЕ ВСЕ, что char (30) всегда 30 байтов   нам, это просто varchar2, который заполнен на максимум   длина. Это помогает нам в обработке - ZERO, Zilch, Zippo.

     

Каждый раз, когда вы видите, что кто-то говорит «это на 50% быстрее», и это -   нет примера, нет науки, нет фактов, нет истории, чтобы поддержать это - просто смейтесь   вслух на них и продолжайте двигаться вперед.

     

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

     
    

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

  
     

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

ответил Anddo 2 42017vEurope/Moscow11bEurope/MoscowThu, 02 Nov 2017 13:42:52 +0300 2017, 13:42:52
0

CHAR

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

VARCHAR2

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

И

At what times we use both?

Все зависит от ваших требований.

ответил Shree 6 FriEurope/Moscow2013-12-06T10:58:51+04:00Europe/Moscow12bEurope/MoscowFri, 06 Dec 2013 10:58:51 +0400 2013, 10:58:51
0

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

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

  

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

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

EDIT: -

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

ответил Rahul Tripathi 6 FriEurope/Moscow2013-12-06T10:59:11+04:00Europe/Moscow12bEurope/MoscowFri, 06 Dec 2013 10:59:11 +0400 2013, 10:59:11

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132