sqlserver 数据库的排序规则和操作系统的语言环境是什么关系?

专注or全面 2017-09-18 04:28:34
又晕了,问题都描述不清楚了

sqlserver的排序规则包含了字符集,因此说排序规则就隐含了字符集(这句话对吧)。
只是还没想明白,

1,当数据库的排序规则是Chinese_PRC_CI_AS的时候,varchar或者char类型可以正常存储汉字
那不是说明varchar也可以支持汉字?那换到别的操作系统上,就有可能有问题了,这是为什么?
当数据库的排序规则是Latin1_General_BIN的时候,varchar或者char类型无法正常存储汉字,又是为什么?

2,Latin1_General_BIN与Latin1_General_CS_AS都是区分大小写的,那么区别是什么?
...全文
378 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
OwenZeng_DBA 2017-09-19
  • 打赏
  • 举报
回复
引用 10 楼 x_wy46 的回复:
MySQL中 sqlserver中 这个应该可以说明问题
感觉你有点被MySQL 思想影响了。两者思维有些区别。 不用想太多。 这里用UNICODE确实不太严谨,那句是从之前比较截取过来的。不过Chinese_PRC 你可以认为是中国的。如果你是在中国时区安装就会默认选这个。NVARCHAR,NCHAR这个才是UNICODE的。他们每个字符是占用2个字节的。
专注or全面 2017-09-19
  • 打赏
  • 举报
回复
字符集是支持双字节的字符集如中文字符集(Collation name为Chinese_PRC_CI_AS)
的时候,一个字符占用两个字节的空间
字符集是支持单字节的字符集如拉丁字符集(Collation name为Latin1_General_CI_AS)
的时候,一个字符占用1个字节的空间,不管中文还是英文, 不论使用不使用N'',中文字符都占1个字节,即可以存x个中文,但只保存前半截中文编码,所以select结果为乱码,因此中文直接就是乱码

因此,如下




但是,中文字符集对应的编码是什么(UTF-16么???)
专注or全面 2017-09-19
  • 打赏
  • 举报
回复

MySQL中


sqlserver中


这个应该可以说明问题
专注or全面 2017-09-19
  • 打赏
  • 举报
回复
引用 7 楼 z10843087 的回复:
[quote=引用 6 楼 x_wy46 的回复:] 有人知道,排序规则与其对应的字符集是怎么样的,比如Chinese_PRC_CI_AS的字符集是什么?Latin1_General_BIN的字符集是什么?
前面的这个部分就是字符集,,前面也回复过了,比如Chinese_PRC 就是字符集。是中国unicode[/quote] 不是这么说的; Unicode 是一个囊括了世界上所有字符的字符集,其中每一个字符都对应有唯一的编码值(code point),注意了!它不是字符编码,仅仅是字符集而已,Unicode 字符如何进行编码,可以是 UTF-8、UTF-16、甚至用 GBK 来编码。 Unicode 本身并没有规定一个字符究竟是用一个还是三个或者四个字节表示。Unicode 只规定了每个字符对应到唯一的代码值(code point),代码值 从 0000 ~ 10FFFF 共 1114112 个值 ,真正存储的时候需要多少个字节是由具体的编码格式决定的。比如:字符 「A」用 UTF-8 的格式编码来存储就只占用1个字节,用 UTF-16 就占用2个字节,而用 UTF-32 存储就占用4个字节。 这个地方比较绕
繁花尽流年 2017-09-19
  • 打赏
  • 举报
回复
其实无所谓数据库预设的规则是什么,order by 后面可以强制按什么语言规则排序 ORDER BY XXX COLLATE Latin1_General_CS_AI
OwenZeng_DBA 2017-09-19
  • 打赏
  • 举报
回复
引用 6 楼 x_wy46 的回复:
有人知道,排序规则与其对应的字符集是怎么样的,比如Chinese_PRC_CI_AS的字符集是什么?Latin1_General_BIN的字符集是什么?
前面的这个部分就是字符集,,前面也回复过了,比如Chinese_PRC 就是字符集。是中国unicode
专注or全面 2017-09-19
  • 打赏
  • 举报
回复
有人知道,排序规则与其对应的字符集是怎么样的,比如Chinese_PRC_CI_AS的字符集是什么?Latin1_General_BIN的字符集是什么?
听雨停了 2017-09-18
  • 打赏
  • 举报
回复
varchar和nvarchar在chinese的排序规则下都可以存储中文汉字的,但在别的排序规则下你要想存中文的话就得用nvarchar才能正常的存储了。就好像你chinese排序规则下存个印度文的话就要用nvarchar,不然存进去就是一个问号。因为对于chinese字符集根本不认识印度文,你如果不存储在国际编码的nvarchar类型下的话就不能正常显示。varchar和nvarchar的区别还在于一个存储所用字节数的问题。nvarchar也就是国际编码的话不管存中英文都是两个字节,而varchar存英文只用一个字节。在以前硬盘很贵的时候,建表就要考虑这个问题,因为如果你都用nvarchar存英文的话就有点浪费磁盘空间了。不过现在不存在这个问题了,因为磁盘空间太便宜了
听雨停了 2017-09-18
  • 打赏
  • 举报
回复
大概的意思就是如下:
假设现在有ABC三个人:
A:只懂中文(Chinese_PRC_CI_AS)
B:只懂英文(Latin1_General_BIN)
C:中英文都懂(unicode也就是国际编码)
假如你现在拿'fuck'这个单词去问A是啥东东,他肯定说不认识,因为他压根不认识啊;
同样的道理你问B'你大爷'是啥意思,他说不定还以为你夸他呢,因为他根本不知道你在骂他啊; 你要是问C上面这两个问题那就是厕所里点灯——找屎了。 排序规则大概就是这么个东东。
OwenZeng_DBA 2017-09-18
  • 打赏
  • 举报
回复
引用 楼主 x_wy46 的回复:
又晕了,问题都描述不清楚了 sqlserver的排序规则包含了字符集,因此说排序规则就隐含了字符集(这句话对吧)。 只是还没想明白, 1,当数据库的排序规则是Chinese_PRC_CI_AS的时候,varchar或者char类型可以正常存储汉字 那不是说明varchar也可以支持汉字?那换到别的操作系统上,就有可能有问题了,这是为什么? 当数据库的排序规则是Latin1_General_BIN的时候,varchar或者char类型无法正常存储汉字,又是为什么? 2,Latin1_General_BIN与Latin1_General_CS_AS都是区分大小写的,那么区别是什么?
补充一下 1.Chinese_PRC_指针对大陆简体字UNICODE的排序规则。所以,Chinese_PRC_CI_AS 能支持汉字。 Latin1_General_BIN 主要是美国,美洲用的字符集。所以不支持中文。但是用nvarchar是可以正常存储的,因为他是unicode的。 2.这个问题在前面的回答一句说了。
二月十六 版主 2017-09-18
  • 打赏
  • 举报
回复
没研究过这块,搜到这个,不知道楼主看到过没有。 https://social.msdn.microsoft.com/Forums/sharepoint/zh-CN/cd90a0a3-95ae-4eb0-aec0-f96abfc1ed4b/sql-server
OwenZeng_DBA 2017-09-18
  • 打赏
  • 举报
回复
引用 楼主 x_wy46 的回复:
又晕了,问题都描述不清楚了 sqlserver的排序规则包含了字符集,因此说排序规则就隐含了字符集(这句话对吧)。 只是还没想明白, 1,当数据库的排序规则是Chinese_PRC_CI_AS的时候,varchar或者char类型可以正常存储汉字 那不是说明varchar也可以支持汉字?那换到别的操作系统上,就有可能有问题了,这是为什么? 当数据库的排序规则是Latin1_General_BIN的时候,varchar或者char类型无法正常存储汉字,又是为什么? 2,Latin1_General_BIN与Latin1_General_CS_AS都是区分大小写的,那么区别是什么?
排序规则名称由两部份构成,前半部份是指本排序规则所支持的字符集。 排序规则的后半部份即后缀 含义: _BIN 二进制排序 也区分大小写 _CI(CS) 是否区分大小写,CI不区分,CS区分 _AI(AS) 是否区分重音,AI不区分,AS区分    _KI(KS) 是否区分假名类型,KI不区分,KS区分  _WI(WS) 是否区分宽度 WI不区分,WS区分

34,571

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧