只是nvarchar支持多字节字符吗?如果是这样的话,除了存储问题之外,使用varchars真的有什么意义吗?
当前回答
这取决于Oracle的安装方式。在安装过程中,将设置NLS_CHARACTERSET选项。您可以使用查询SELECT值$FROM sys.props$WHERE name=“NLS_CHARACTERSET”找到它。
如果NLS_CHARACTERSET是像UTF8这样的Unicode编码,那就太好了。使用VARCHAR和NVARCHAR几乎完全相同。现在停止阅读,继续阅读。否则,如果您无法控制Oracle字符集,请继续阅读。
VARCHAR-数据存储在NLS_CHARACTERSET编码中。如果同一服务器上有其他数据库实例,您可能会受到它们的限制;反之亦然,因为您必须共享设置。这样的字段可以存储可以使用该字符集编码的任何数据,而不存储其他数据。因此,例如,如果字符集是MS-1252,则只能存储英文字母、少数重音字母和其他一些字符(如€和-)。您的应用程序仅对少数地区有用,无法在世界其他任何地方运行。因此,这被认为是一个坏主意。
NVARCHAR-数据以Unicode编码存储。支持每种语言。好主意。
存储空间呢?VARCHAR通常是高效的,因为字符集/编码是为特定的语言环境定制的。NVARCHAR字段以UTF-8或UTF-16编码存储,讽刺的是基于NLS设置。UTF-8对于“西方”语言非常有效,同时仍然支持亚洲语言。UTF-16对亚洲语言非常有效,同时仍然支持“西方”语言。如果担心存储空间,请选择NLS设置以使Oracle根据需要使用UTF-8或UTF-16。
处理速度如何?大多数新的编码平台本机使用Unicode(Java、.NET,甚至是多年前的C++std::wstring!),所以如果数据库字段是VARCHAR,它会迫使Oracle在每次读取或写入时在字符集之间进行转换,这就不太好了。使用NVARCHAR可避免转换。
底线:使用NVARCHAR!它避免了限制和依赖性,对存储空间很好,通常对性能也是最好的。
其他回答
由于SQL Server 2019 varchar列支持UTF-8编码。
因此,从现在开始,不同的是规模。
在转换为速度差异的数据库系统中。
更少的数据=更少的IO+更少的内存=通常速度更快。阅读上面的文章了解数字。
从现在开始在UTF8中使用varchar!
只有当您拥有2048-16383和16384-65535范围内的大量字符时,您才需要测量
我会说,这取决于情况。
如果您开发一个桌面应用程序,其中操作系统以Unicode(与所有当前的Windows系统一样)工作,并且语言本身支持Unicode(默认字符串为Unicode,如Java或C#),那么使用nvarchar。
如果您开发了一个web应用程序,其中字符串以UTF-8形式出现,语言为PHP,而PHP本身仍然不支持Unicode(在5.x版本中),那么varchar可能是一个更好的选择。
遵循Sql Server VARCHAR和NVARCHAR数据类型之间的差异。在这里,你可以看到一个非常描述性的方式。
一般来说,varchar将数据存储为Unicode,因此,如果要在数据列中存储多语言数据(多种语言),则需要N变量。
我总是使用nvarchar,因为它允许我正在构建的任何东西都能承受我扔给它的几乎所有数据。我的CMS系统使用中文是偶然的,因为我使用了nvarchar。现在,任何新的应用程序都不应该真正关注所需的空间量。
与varchar相比,nvarchar使用起来是安全的,因为nvarchar也允许unicode字符,所以我们的代码不会出错(类型不匹配)。当我们在SQL Server查询中使用where条件时,如果我们使用的是=运算符,它会多次抛出错误。可能的原因是我们的映射列将在varchar中定义。如果我们在nvarchar中定义它,这个问题就不会发生。尽管如此,我们还是坚持varchar并避免这个问题,我们最好使用LIKE关键字而不是=。
推荐文章
- 在SQL server查询中将NULL替换为0
- 在SQL中修改表的模式名
- 如何得到累计和
- 如何在SQL Server 2005的一条语句中更新两个表?
- 如何创建临时表与SELECT * INTO tempTable从CTE查询
- 在SQL Server的选择语句中使用带TOP的变量,而不是动态的
- SQL变量保存整数列表
- 在SQL中转换月号到月名函数
- 改变一个varchar列的最大长度?
- 如何在SQL中从DateTime格式获取时间?
- 暂时关闭约束(MS SQL)
- WHERE子句中的IF子句
- 如何在SSMS中从ntext或nvarchar(max)查看所有文本?
- 创建表如果在SQL Server中不存在
- MSSQL错误“底层提供者在打开时失败”