SQL 的排序规则问题。请教一二三四五六七八九十JQK

马老虎 2010-09-08 02:42:52
我们公司的服务器的数据库是 中文 sql2000(排序规则:Chinese_PRC_CI_AS)
客户服务器的数据是 英文 sql2000 (排序规则:SQL_Latin1_General_CP1_CI_AS)
都是企业版。

数据库名称是:DataBase_XXX

为了在给客户部署数据库的时候省点麻烦,
我在创建的数据库DataBase_XXX 的时候,就将排序规则修改成了 SQL_Latin1_General_CP1_CI_AS
然后创建的表的字段时候也是使用SQL_Latin1_General_CP1_CI_AS排序规则。

问题:现在我们需要往数据库中初始化一部分 中文的信息,但是插入的中文数据全部显示为问号。

Insert into dbo.tb_province (1,'北京市')--使用插入语句也是显示的问号
UPDATE dbo.tb_province SET province ='北京市' WHERE id =1 --Update 还是问号

使用.net 程序执行插入语句 还是显示的问号。。

请问SQL高手,原因是什么??
我将本地数据库的排序规则修改成 SQL_Latin1_General_CP1_CI_AS 是否妥当?
请大家赐教!!
...全文
748 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
马老虎 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 feilniu 的回复:]

引用 14 楼 mmm306306 的回复:

不过你说的保持一致的意思 应该包括 排序规则的一致喽。


当然。排序规则和字符编码是数据库设计首先要考虑的问题之一。

保持一致的目的是避免相同的程序在不同的环境下跑出不同的结果。所以,任何可能导致程序结果变化的配置都应该(尽量)保持一致。否则你的程序开发将是一场灾难。
[/Quote]
谢谢!!
feilniu 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 mmm306306 的回复:]

不过你说的保持一致的意思 应该包括 排序规则的一致喽。
[/Quote]

当然。排序规则和字符编码是数据库设计首先要考虑的问题之一。

保持一致的目的是避免相同的程序在不同的环境下跑出不同的结果。所以,任何可能导致程序结果变化的配置都应该(尽量)保持一致。否则你的程序开发将是一场灾难。
hovy_yang 2010-09-08
  • 打赏
  • 举报
回复
我来学习的
马老虎 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 feilniu 的回复:]

引用 8 楼 mmm306306 的回复:
我想问问大家 在开发的时候有没有必要将本地的数据库的排序规则设置的和服务器上的一致??


本地VS服务器的说法不严谨。
即使是连接本地,也是用本机的客户端连接本机的服务器。详见该帖3.2节。

对于数据库开发来说,客户端程序(SSMS)在哪里不重要,主要是服务器端:
1. 开发环境:通常在本机,多人开发也可能有共用的开发服务器。
2……
[/Quote]
十分感谢你不辞辛苦的回答!!
那个帖子我看了,感觉学到了点。
不过你说的保持一致的意思 应该包括 排序规则的一致喽。
马老虎 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 ws_hgo 的回复:]

引用 8 楼 mmm306306 的回复:
引用 6 楼 feilniu 的回复:

如果是开发中文系统:

1. 数据库服务器最好设置排序规则为Chinese_PRC_XXX。
2. 即使服务器是别的排序规则,数据库的排序规则也应该设为Chinese_PRC_XXX。
3. 中文信息一律用nvarchar/nchar存储。

其实最后我们是采用兄弟说的第三点。
将字段使用n……
[/Quote]

由于上次给客户部署数据库的时候,就遇到这个排序规则的麻烦,
所以这次新的项目我特别考虑到数据库排序规则的问题。

上次的情况是这样的:
表A 是在我们本地创建的 包含字段 id(int) name(varchar)
表A 的排序规则是:Chinese_PRC_CI_AS
有一个存储过程,创建了临时表 #tb1 字段有 name(varchar)

在客户服务器上
然后将表A和#tb1关联查询 但是由于排序规则的不一样,导致报错。。。。

最后我只好将所有存储过程中的临时表 的varchar字段的排序转成:Chinese_PRC_CI_AS

看看高手有什么更多的见解!!
谢谢各位了!!



Rotel-刘志东 2010-09-08
  • 打赏
  • 举报
回复
创建数据库和表时编码错误 chinese_prc_as
ws_hgo 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 mmm306306 的回复:]
引用 6 楼 feilniu 的回复:

如果是开发中文系统:

1. 数据库服务器最好设置排序规则为Chinese_PRC_XXX。
2. 即使服务器是别的排序规则,数据库的排序规则也应该设为Chinese_PRC_XXX。
3. 中文信息一律用nvarchar/nchar存储。

其实最后我们是采用兄弟说的第三点。
将字段使用nvarchar存储。

我想问问大家 在开发……
[/Quote]

没有必要
feilniu 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 mmm306306 的回复:]
我想问问大家 在开发的时候有没有必要将本地的数据库的排序规则设置的和服务器上的一致??
[/Quote]

本地VS服务器的说法不严谨。
即使是连接本地,也是用本机的客户端连接本机的服务器。详见该帖3.2节。

对于数据库开发来说,客户端程序(SSMS)在哪里不重要,主要是服务器端:
1. 开发环境:通常在本机,多人开发也可能有共用的开发服务器。
2. 测试环境:纯测试用的服务器。
3. 部署环境:实际部署到用户环境中的服务器。

最好保证以上3个环境的配置都是一样的,包括:
1. 操作系统的配置;
2. 盘符和相关文件路径(如数据文件夹、日志文件夹、备份文件夹)设置;
3. 数据库服务器实例的安装和配置;
billpu 2010-09-08
  • 打赏
  • 举报
回复
最好是一致,不然肯定对你的数据库使用带来不便
另外nvarchar ntext nchar在开发多语言环境是必须的
马老虎 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 feilniu 的回复:]

如果是开发中文系统:

1. 数据库服务器最好设置排序规则为Chinese_PRC_XXX。
2. 即使服务器是别的排序规则,数据库的排序规则也应该设为Chinese_PRC_XXX。
3. 中文信息一律用nvarchar/nchar存储。
[/Quote]
其实最后我们是采用兄弟说的第三点。
将字段使用nvarchar存储。

我想问问大家 在开发的时候有没有必要将本地的数据库的排序规则设置的和服务器上的一致??
马老虎 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ws_hgo 的回复:]

SQL code
病症表现为:主要表现为用T-sql语句插入中文数据时数据库显示全是问号“???”
解决办法:

第一种办法:先选中出错的数据库→选中以后右键点击属性会弹出数据库属性 对话框→选中数据库属性对话框中的选项→把选项中的排序规则设置成:Chinese_PRC_90_CI_AS→最后点击确定即可。
(注意:在选择数据库属性的时候必须确保你所修改的数据库未被使用才可以修改否则会失败的……
[/Quote]
谢谢兄弟的讲解!
feilniu 2010-09-08
  • 打赏
  • 举报
回复
如果是开发中文系统:

1. 数据库服务器最好设置排序规则为Chinese_PRC_XXX。
2. 即使服务器是别的排序规则,数据库的排序规则也应该设为Chinese_PRC_XXX。
3. 中文信息一律用nvarchar/nchar存储。
马老虎 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 haiwer 的回复:]

当初选择就错了,有中文应该选择排序规则:Chinese_PRC_CI_AS

现在可能只能将已经建立的库、表的排序规则改成Chinese_PRC_CI_AS
[/Quote]

之前有有个项目就是因为排序规则的问题。
存储过程中的 创建的临时表 varchar的字段全部都转排序规则为:Chinese_PRC_CI_AS
ws_hgo 2010-09-08
  • 打赏
  • 举报
回复
病症表现为:主要表现为用T-sql语句插入中文数据时数据库显示全是问号“???” 
解决办法:

第一种办法:先选中出错的数据库→选中以后右键点击属性会弹出数据库属性 对话框→选中数据库属性对话框中的选项→把选项中的排序规则设置成:Chinese_PRC_90_CI_AS→最后点击确定即可。
(注意:在选择数据库属性的时候必须确保你所修改的数据库未被使用才可以修改否则会失败的)

第二种办法:首先打开你的sql查询分析器(新建查询),然后输入以下代码执行即可:

ALTER DATABASE 数据库名 COLLATE Chinese_PRC_90_CI_AS
例如:
USE master
GO
ALTER DATABASE mydb COLLATE Chinese_PRC_CI_AS

解析原因:出现以上情况主要是因为数据库属性的排序规则设置不正确,在Microsoft SQL Server 2005 中,字符串的物理存储由排序规则控制。排序规则指定表示每个字符的位模式以及存储和比较字符所使用的规则。
排序规则名称由两部份构成,前半部份是指本排序规则所支持的字符集。
如:
  Chinese_PRC_90_CI_AS
前半部份:指UNICODE字符集,Chinese_PRC_指针对大陆简体字UNICODE的排序规则。
排序规则的后半部份即后缀 含义:
  _BIN 二进制排序
  _CI(CS) 是否区分大小写,CI不区分,CS区分
  _AI(AS) 是否区分重音,AI不区分,AS区分   
  _KI(KS) 是否区分假名类型&defKI不区分,KS区分 
_WI(WS) 是否区分宽度 WI不区分,WS区分 

区分大小写:如果想让比较将大写字母和小写字母视为不等,请选择该选项。
区分重音:如果想让比较将重音和非重音字母视为不等,请选择该选项。如果选择该选项,比较还将重音不同的字母视为不等。
区分假名:如果想让比较将片假名和平假名日语音节视为不等,请选择该选项。
区分宽度:如果想让比较将半角字符和全角字符视为不等,请选择该选项(完)。
昵称被占用了 2010-09-08
  • 打赏
  • 举报
回复
当初选择就错了,有中文应该选择排序规则:Chinese_PRC_CI_AS

现在可能只能将已经建立的库、表的排序规则改成Chinese_PRC_CI_AS
马老虎 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 claro 的回复:]

不妥当
[/Quote]
请赐教,那我该怎么办?
客户服务器数据库的排序规则
和我本地的排序规则不一样啊。。。
claro 2010-09-08
  • 打赏
  • 举报
回复
不妥当

27,581

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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