创建表格
CREATE TABLE test (
charcol CHAR(10),
varcharcol VARCHAR2(10));
SELECT LENGTH(charcol), LENGTH(varcharcol) FROM test;
结果:
LENGTH(CHARCOL) LENGTH(VARCHARCOL)
--------------- ------------------
10 1
请告诉我Varchar2和char有什么区别? 我们什么时候都使用它们?
答案 0 :(得分:19)
显示差异的简单示例:
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
答案 1 :(得分:18)
这是一个旧帖子,但它只是谷歌搜索'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_sale_currency
变量是隐身char
,对于较短的值(或''
),它将被隐藏空白填充,为l_sale_currency
不等于的l_refund_currency
打开了大门'ZZ'
,即使您已为这两个人分配了CHAR
。
CHAR
,我确信,ANSI兼容性原因。可能有潜在的客户决定购买哪个数据库产品并且 ANSI兼容性在他们的核对清单上(或者曾经是当时),并且ANSI标准中定义了带有空白填充的[HttpPost]
public async Task<IActionResult> UploadFile(ICollection<IFormFile> files)
{
var uploads = Path.Combine(_environment.WebRootPath, "uploads");
foreach (var file in files)
{
if (file.Length > 0)
{
fileName = Path.GetFileName(file.FileName);
using (var fileStream = new FileStream(Path.Combine(uploads, fileName), FileMode.Create))
{
await file.CopyToAsync(fileStream);
}
}
}
ProcessFile();
return View("NewProject");
}
private void ProcessFile()
{
//Do WORK
}
,所以Oracle需要提供它。你不应该真正使用它。
答案 2 :(得分:4)
CHAR 类型具有固定大小,因此如果你说它是10个字节,那么它总是在数据库中存储10个字节,无论你是存储任何文本还是只是空10个字节都无关紧要
VARCHAR2 大小取决于您实际要在数据库中存储的字节数。您指定的数字只是可以存储的最大字节数(尽管最少1个字节)
在处理固定长度的字符串时你应该使用CHAR(你事先知道你将要存储的字符串的确切长度) - 然后数据库可以更好更快地操作它,因为它知道确切的长度
如果您不知道存储字符串的确切长度,则应使用VARCHAR2。
您可以使用两者的情况可能是:
name VARCHAR2(255),
zip_code CHAR(5) --if your users have only 5 place zip codes
答案 3 :(得分:3)
只是为了避免混淆错误的信息。以下是有关差异的一些信息,包括性能
参考:https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:2668391900346844476
因为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个字节(空指示符,前导字节 长度,'a'为30个字节)
嗯,varchar2会有点“处于优势表现 明智的“。它不会帮助我们所有的char(30)总是30个字节 - 来 我们,它只是一个空白填充到最大的varchar2 长度。它帮助我们处理 - ZERO,zilch,zippo。
任何时候你看到有人说“它的速度提高了50%”,就是这样 - 没有例子,没有科学,没有事实,没有故事支持它 - 只是笑 大声对他们说话,继续前进。
该页面上还有其他“组成的东西”,例如:
“在CHAR中搜索速度更快,因为所有字符串都存储在中 从彼此指定的位置,系统不必 搜索字符串的结尾。而在VARCHAR中,系统必须 首先找到字符串的结尾,然后去搜索。“
FALSE:char只是一个varchar2空白填充 - 我们不存储 字符串“在彼此指定的位置”。我们搜索 字符串的结尾 - 我们使用前导字节长度来计算事物 进行。
答案 4 :(得分:2)
<强> CHAR 强>
CHAR应该用于存储修复长度字符串。在存储在磁盘上之前,字符串值将为空格/空白填充。如果此类型用于存储varibale长度字符串,则会浪费大量磁盘空间。
<强> VARCHAR2 强>
VARCHAR2用于存储可变长度的字符串。字符串值的长度将以值本身存储在磁盘上。
和强>
At what times we use both?
这一切都取决于你的要求。
答案 5 :(得分:1)
当存储在数据库中时,varchar2仅使用分配的空间。例如。如果您有一个varchar2(1999)并在表中放入50个字节,它将使用52个字节。
但是,当存储在数据库中时,char始终使用最大长度,并用空白填充。例如。如果您有char(1999)并在表中放入50个字节,则将消耗2000个字节。
答案 6 :(得分:0)
CHAR 用于存储修复长度字符串。如果此类型用于存储varibale长度字符串,则会浪费大量磁盘空间。
VARCHAR2 用于存储可变长度的字符串。
我们在什么时候同时使用它们?
这可能会有所不同,具体取决于您的要求。
修改: - 强>
让我们通过一个例子理解这一点,如果你有一个大小为10的学生姓名栏; sname CHAR(10)
并且如果插入了列值'RAMA'
,则会在值的右侧插入 6个空格。如果这是VARCHAR列; sname VARCHAR2(10).
然后,Varchar将从10个中取出4个空格,然后释放下6个用于其他用途。