我们必须使用Unicode类型时是否有规则?
我已经看到大多数欧洲语言(德语,意大利语,英语......)在VARCHAR列中的同一数据库中都很好.
我正在寻找类似的东西:
那么服务器/数据库的整理呢?
我不想像这里建议的一样使用NVARCHAR.varchar 和nvarchar SQL Server数据类型之间的主要性能差异是什么?
在SQL Server中创建表时如何设置字段的默认字符集?在MySQL中,我们这样做:
CREATE TABLE tableName (
name VARCHAR(128) CHARACTER SET utf8
) DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
Run Code Online (Sandbox Code Playgroud)
请注意,我在这里设置了两次字符集.这是多余的,我添加了两种方式来演示.
我还设置了排序规则,以证明排序规则是不同的.我不是要求设置整理.大多数 关于SQL Server中的字符集和编码的问题都通过整理来回答,这不是一回事.
IVe阅读了很多关于此的内容.
还有一些问题:
我不是在谈论区分大小写......
如果我有一个char(?例如)并且他存储在nvarchar - 它可以容纳任何东西,为什么我需要collation在这里?
如果我是"FaceBook"并且我需要能够存储语言中的all字符all,那么校对和我的nvarchar列之间的关系是什么?
提前致谢.
所有 3 个选项都区分大小写和重音,并支持 Unicode。根据文档:
NVarchar 根据“相关语言或字母表的字典”对数据进行排序和比较 (?)
Bin 根据“位模式”(?)对数据进行排序和比较
Bin2根据“Unicode数据的Unicode代码点”对数据进行排序和比较(?)
把复杂的事情简单化,我能不能说Bin是NVarchar的改进,Bin2是Bin的改进;除非我仅限于向后兼容,否则总是建议使用 Bin2 或至少使用 Bin 以享受更好的性能?
================================================== ======================== 我会再次尝试解释我自己。
看一看:
If Object_ID('words2','U') Is Not Null Drop Table words2;
Create Table words2(word1 NVarchar(20),
word2 NVarchar(20) Collate Cyrillic_General_BIN,
word3 NVarchar(20) Collate Cyrillic_General_BIN2);
Insert
Into words2
Values (N'???????',N'???????',N'???????'),
(N'?????????',N'?????????',N'?????????'),
(N'?????',N'?????',N'?????'),
(N'???',N'???',N'???');
Select * From words2;
Run Code Online (Sandbox Code Playgroud)
所有 3 个选项都支持各种字母表,无论是什么排序规则。
问题是 - 3 个选项之间的实际区别是什么?假设我想以不同的字母存储私人姓名,我可以使用哪个选项?我想我将不得不找到特定的名称(选择...从...在哪里...),订单名称(选择...从...订购...)。
与/sf/answers/2329882481/相关,我发现从SQL Server(2014)中提取数据的行为不一致.
library(RODBC)
sqlQuery(.conn, "CREATE TABLE r2test ( [mychar] [NVARCHAR](16), [mynum] [FLOAT])")
# character(0)
sqlQuery(.conn, "INSERT INTO r2test (mychar,mynum) VALUES ('1',3.141593),('2',6.283185)")
character(0)
str(sqlQuery(.conn, "SELECT * FROM r2test", stringsAsFactors = FALSE))
# 'data.frame': 2 obs. of 2 variables:
# $ mychar: int 1 2
# $ mynum : num 3.14 6.28
Run Code Online (Sandbox Code Playgroud)
在该示例中,我们看到了不期望的行为:mychar内部转换为整数的字符.根据前面提到的SO答案,该as.is选项会使这个失败,但是还有一个不幸的副作用,即强制将十进制表示的浮点数转换为字符串:
str(sqlQuery(.conn, "SELECT * FROM r2test", stringsAsFactors = FALSE, as.is = TRUE))
# 'data.frame': 2 obs. of 2 variables:
# $ mychar: chr "1" …Run Code Online (Sandbox Code Playgroud)