SQL server 2008创建DB时如何设置Collation才能适应多国语系统

mly_skywater 2011-02-27 10:46:54
可能标题说的不清楚,我描述下我的问题:
创建一个Database时,会有很多默认的设置选项,一般新创建的DB会是一个固定大小(也和设置有关,不做研究)。
我用VC写的应用程序每创建一个实例都需要生成一个DB,因此我将这样一个数据库的MDF文件保存起来,作为一个临时文件。
以后在我的工程中需要创建数据库时,我都会将这个临时文件拷贝出来,然后再attach到数据库中,修改一下数据库的Logical Name就可以生成一个新的DB。
而我的数据库创建的Collation默认是 Chinese_PRC_CI_AS,因此我的这样一个数据库模板 的Collation是固定的。

我的问题:
1、假设我的应用程序在全球不同地区使用,如美洲,欧洲等不同地域上使用时,我的应用程序在不同语言的windows操作系统中(windows 7, Vista, XP)使用,使用上述的Collation为Chinese_PRC_CI_AS的模板来创建出新的数据库是否会存在问题?假设在一个语言很特殊的系统中,我用上述方法一定能成功生成新的DB吗(attach会失败吗)?

2、我做过一些测试,在我当前的xp2003英文系统下,Server Collation设置为Chinese_PRC_CI_AS,创建一个新的DB,如果Collation设置成 Yakut_100_CS_AS_WS(随便选的),就会创建失败,提示 “不支持SQL server 指定的排序规则”。
因为我的应用程序必须支持全球各地区使用,那么我想是否在别的系统中也可能存在不支持 Chinese_PRC_CI_AS而导致DB创建失败,这样的话,我使用的DB模板的Collation如何设置才能通用了。设置成Latin有区别吗?
这个网上有说是因为操作系统不支持这种Collation,那么如何知道我设置的Collation是当前系统支持的?如何提供所有操作系统都支持的这样一个模板文件了(Collation如何设置)?

问题2:
我的应用程序是需要支持多国语的,如果我的DB的Collation为Chinese_PRC_CI_AS,那么我在数据库中存储任何语言的字符会有问题吗,假设都是用Unicode方式。这个我觉的应该不会有问题,下面这个链接似乎就可以解决围绕难题。
http://topic.csdn.net/u/20091117/17/8D708AF4-D596-45C3-8C6E-7BCA6F644DD0.html

申明,本人是在看过多次 msdn 的英文帮助文档后还是迷惑,什么windows, SQL server collations,感觉不能解决我实际使用起来遇到的问题,遂来发帖求助,请各位大侠指点,谢谢了。

...全文
773 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
SQL77 2011-02-28
  • 打赏
  • 举报
回复
使用UNICODE字符集,字段类型用NVARCHAR
mly_skywater 2011-02-28
  • 打赏
  • 举报
回复
哥们,你没明白我的意思,我是在vc程序中去创建一个数据库,我使用的是一个已经创建好的mdf文件,这个文件肯定是有个一个默认的collation,但是我的程序如果在别的不同语言的机器上运行,通过copy这个mdf文件,在attach成新的DB,是否会失败。

[Quote=引用 1 楼 so_cool 的回复:]

那不用定义成什么语言,服务器是什么语言,sql在新建database的时候会和服务器的语言是一样的。不用特意去定义,
[/Quote]
So_CooL 2011-02-28
  • 打赏
  • 举报
回复
那不用定义成什么语言,服务器是什么语言,sql在新建database的时候会和服务器的语言是一样的。不用特意去定义,
mly_skywater 2011-02-28
  • 打赏
  • 举报
回复
我理解的他们说的就是Chinese_PRC_CI_AS中字符的排列顺序和比较规则吧,设置成Chinese肯定就是中国拼音的风格,但是设置是Latin或者其他,就可能导致不一样的排列顺序吧,我看过帮助文档上就说过一个
单词的排列顺序的问题,
an English speaker would expect the character string 'Chiapas' to come before 'Colima' in ascending order. However, a Spanish speaker in Mexico might expect words beginning with 'Ch' to appear at the end of a list of words starting with 'C'. Collations dictate these kinds of sorting and comparison rules. The Latin_1 General collation will sort 'Chiapas' before 'Colima' in an ORDER BY ASC clause, whereas the Traditional_Spanish collation will sort 'Chiapas' after 'Colima'.
链接如下:
http://msdn.microsoft.com/en-us/library/ms187582.aspx
说的Latin比较通用,就是指的这方面吧。就是语言使用的习惯问题吧。
但是如果在Latin的DB中存储中文,就不知道按什么顺序排列了。

[Quote=引用 16 楼 coleling 的回复:]
每次看到这些回复,都让我十分蛋疼,知其然不知其所以然,一个个还说得起劲的很。

Chinese_PRC_CI_AS比Latin到底差在哪里?给个例子先...
[/Quote]
mly_skywater 2011-02-28
  • 打赏
  • 举报
回复
你说的这个字符集的设置项在哪有啊,2005中有吗,我在2008中找不到,你说的是哪项。

[Quote=引用 18 楼 xys_777 的回复:]
sqlserver的字符集的设置里没有unicode吗?没用过2008不知道

但是2005的我是测过的,想做到支持多国语言还真是没啥办法,

除非你在你的所有sql语句上都用N转换成unicode
[/Quote]
billpu 2011-02-28
  • 打赏
  • 举报
回复
http://msdn.microsoft.com/zh-cn/library/ms184391%28v=sql.90%29.aspx
看仔细,不要走马观花哦
永生天地 2011-02-28
  • 打赏
  • 举报
回复
sqlserver的字符集的设置里没有unicode吗?没用过2008不知道

但是2005的我是测过的,想做到支持多国语言还真是没啥办法,

除非你在你的所有sql语句上都用N转换成unicode
tiantianxiangshhao 2011-02-28
  • 打赏
  • 举报
回复
确实十分无解。。。。。
coleling 2011-02-28
  • 打赏
  • 举报
回复
每次看到这些回复,都让我十分蛋疼,知其然不知其所以然,一个个还说得起劲的很。

Chinese_PRC_CI_AS比Latin到底差在哪里?给个例子先...
bashen1101 2011-02-28
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 mly_skywater 的回复:]
我不确定Unicode的时候,字符的排列顺序还会因为地区不同而不同吗?
是不是也会有所不同了?我好想错了。。。
[/Quote]
即使你用了UNICODE,字符的排列顺序仍然是按你设置的COLLATION来排序的
这个试验你可以在本机上试的嘛

归根到底,你要统一字符集,那么选UNICODE是没错的
你要统一排序规则,那么选LATIN是没错的
Austindatabases 2011-02-28
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 mly_skywater 的回复:]
感谢大家的发言,让我受益匪浅。

我说的全球支持,就是我的产品可能在全球各个地区,如亚洲,非洲,美洲等都可能有我的客户。
我使用的系统是英文系统,应该是我在安装SQL server studio的时候控制面板中“地域和语言的设置->高级中的设置是Chinese的关系,所以SQL server默认的collation是 Chinese_PRC_CI_AS。
我的理解是如果设置为Unicode……
[/Quote]

你客气了,不过我还的说一句,最好不要使用CHINESE, 某ERP软件我们的一个项目就因为选择了支持法语的COLLATION,后期的其他国家的项目中麻烦不断,甚至搜索出的字符有乱码,当然UNICODE是个方法,不过
如果有可能还是要LATIN然后区分大小写,这样会在后期给自己省出很多解决麻烦的时间,好运
mly_skywater 2011-02-28
  • 打赏
  • 举报
回复
我不确定Unicode的时候,字符的排列顺序还会因为地区不同而不同吗?
是不是也会有所不同了?我好想错了。。。
mly_skywater 2011-02-28
  • 打赏
  • 举报
回复
感谢大家的发言,让我受益匪浅。

我说的全球支持,就是我的产品可能在全球各个地区,如亚洲,非洲,美洲等都可能有我的客户。
我使用的系统是英文系统,应该是我在安装SQL server studio的时候控制面板中“地域和语言的设置->高级中的设置是Chinese的关系,所以SQL server默认的collation是 Chinese_PRC_CI_AS。
我的理解是如果设置为Unicode,那么Collation的选择就无所谓了,Unicode字符的显示顺序和比较应该和collation都无关了吧。这样DB中存储的字符的顺序啥的应该都不受collation影响了。
而我的数据库只是用来记录我应用程序中的数据,客户是在我的应该程序看到这些数据的,数据的排列也是我控制的。所以似乎这个Collation不改也行嘛,当然说国际化,确实你说的LATIN是正道,这里只讨论不修改的坏处。
另外我认为存在的坏处就是可能如果DB中存入了非unicode后才会导致排序问题。也就是说是一种潜在的风险?
不知道我理解是否正确。


[Quote=引用 11 楼 liuhuayang 的回复:]

引用楼主 mly_skywater 的回复:
可能标题说的不清楚,我描述下我的问题:
创建一个Database时,会有很多默认的设置选项,一般新创建的DB会是一个固定大小(也和设置有关,不做研究)。
我用VC写的应用程序每创建一个实例都需要生成一个DB,因此我将这样一个数据库的MDF文件保存起来,作为一个临时文件。
以后在我的工程中需要创建数据库时,我都会将这个临时文件拷贝出来,然后再a……
[/Quote]
Austindatabases 2011-02-28
  • 打赏
  • 举报
回复
[Quote=引用楼主 mly_skywater 的回复:]
可能标题说的不清楚,我描述下我的问题:
创建一个Database时,会有很多默认的设置选项,一般新创建的DB会是一个固定大小(也和设置有关,不做研究)。
我用VC写的应用程序每创建一个实例都需要生成一个DB,因此我将这样一个数据库的MDF文件保存起来,作为一个临时文件。
以后在我的工程中需要创建数据库时,我都会将这个临时文件拷贝出来,然后再attach到数据库中,修改一下数据库的Logica……
[/Quote]

这里首先要问你一个问题,什么叫全球支持,这里给你一个参考,如果想做一个全球系统都能支持的系统
那你首先无条件的就不能选择CHINESE,LATIN's collation才是你应该选择的,这里每个COLLATION都不是万能的,首先你的数据库系统就不应该是中文的,你应该使用英文的WINDOWS + SQL SERVER来完成你的开发工作而应该使用默认的SQL SERVER 英文版本的默认COLLATION,当然如果需要注意大小写,那你还得选择
加AI(SORRY我忘记了是AS还是AI)你可以GOOGLE一下.
coleling 2011-02-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 mly_skywater 的回复:]

兄台,要是这样就完美了,但是你的这个结论官方有资料文档说明吗?我要直接这么说,我们leader肯定说依据在哪里,她就是担心现在这个数据库模板不能通用。
我看help文档里都没有说,别告诉我这是常识,我可就蒙了。

引用 8 楼 coleling 的回复:

引用楼主 mly_skywater 的回复:
可能标题说的不清楚,我描述下我的问题:
创建一个Database时,会有很多默认……
[/Quote]

这个官方资料文档嘛..., 到处都是啊..., 呵呵!应该说,这是个常识,没有必要单独拿出来说。

按理说,所有的排序规则在所有的windows操作系统中都是支持的。但也有些异常情况(如楼主所举例子),这是因为有些排序规则是新加的,而有些操作系统是很“老”的(如XP、windows server 2003),所以才会出现不支持的情况。

如果换到一些“新”的操作系统(如windows server 2008、windows 7等)中,则刚才的异常情况,也就不会再发生了。
mly_skywater 2011-02-28
  • 打赏
  • 举报
回复
兄台,要是这样就完美了,但是你的这个结论官方有资料文档说明吗?我要直接这么说,我们leader肯定说依据在哪里,她就是担心现在这个数据库模板不能通用。
我看help文档里都没有说,别告诉我这是常识,我可就蒙了。

[Quote=引用 8 楼 coleling 的回复:]

引用楼主 mly_skywater 的回复:
可能标题说的不清楚,我描述下我的问题:
创建一个Database时,会有很多默认的设置选项,一般新创建的DB会是一个固定大小(也和设置有关,不做研究)。
我用VC写的应用程序每创建一个实例都需要生成一个DB,因此我将这样一个数据库的MDF文件保存起来,作为一个临时文件。
以后在我的工程中需要创建数据库时,我都会将这个临时文件拷贝出来,然后再a……
[/Quote]
coleling 2011-02-28
  • 打赏
  • 举报
回复
[Quote=引用楼主 mly_skywater 的回复:]
可能标题说的不清楚,我描述下我的问题:
创建一个Database时,会有很多默认的设置选项,一般新创建的DB会是一个固定大小(也和设置有关,不做研究)。
我用VC写的应用程序每创建一个实例都需要生成一个DB,因此我将这样一个数据库的MDF文件保存起来,作为一个临时文件。
以后在我的工程中需要创建数据库时,我都会将这个临时文件拷贝出来,然后再attach到数据库中,修改一下数据库的Logica……
[/Quote]

1、Chinese_PRC_CI_AS排序规则,在各种语言的操作系统中都是支持的,不会出现attach失败的情况,可以放心使用。

2、部分SQL 2008新增的排序规则,可能会出现"不支持SQL server 指定的排序规则"的错误(你随便选的Yakut就在其中)。其实大部分常见的排序规则,在所有操作系统(windows)中都是支持的。
mly_skywater 2011-02-28
  • 打赏
  • 举报
回复
这位兄台把我的问题看的很明白,我费那么半天似乎反倒把问题给描述的复杂了。
你的意思是不是让我根据不同地域的系统去修改数据库的collation值吗?比如在美洲就改成SQL_Latin1_General_CP1_CI_AS, 在中国就改成 Chinese_PRC_CI_AS?

我的问题似乎就可以简化成如下了:
在我的电脑上创建的数据库文件,它的Collation设置是 Chinese_PRC_CI_AS, 将这个mdf文件复制到别的语言和系统的电脑上是否还能打开,会不会出现某些系统不支持 Chinese_PRC_CI_AS 而导致打开失败?
问题的关键就是有不支持 Chinese_PRC_CI_AS 的windows系统吗?和系统装windows的没装汉语语言包有关系吗?如果改成 SQL_Latin1_General_CP1_CI_AS 就肯定通用了吗?

[Quote=引用 5 楼 bashen1101 的回复:]

关于问题2:UNICODE存储任何语言文字应该是不会有任何问题的呢

关于问题1:我觉得COLLATION只是一个排序标准的问题,并不对数据本身产生影响,关键看你的数据库结构和查询语句是否涉及到排序
你考虑的是数据迁移,用的方法是分离和附加,不同的COLLATION会让你报错,这个我觉得你分离前选择一个目标服务器有该排序的,然后修改下再分离即可。当然你如果为了简便些,想找个通用的,那……
[/Quote]
bashen1101 2011-02-28
  • 打赏
  • 举报
回复
英语操作系统默认的好像是这个SQL_Latin1_General_CP1_CI_AS
bashen1101 2011-02-28
  • 打赏
  • 举报
回复
关于问题2:UNICODE存储任何语言文字应该是不会有任何问题的呢

关于问题1:我觉得COLLATION只是一个排序标准的问题,并不对数据本身产生影响,关键看你的数据库结构和查询语句是否涉及到排序
你考虑的是数据迁移,用的方法是分离和附加,不同的COLLATION会让你报错,这个我觉得你分离前选择一个目标服务器有该排序的,然后修改下再分离即可。当然你如果为了简便些,想找个通用的,那就统一用LATIN吧,应该没问题
加载更多回复(1)

34,587

社区成员

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

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