sqlserver 排序规则的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqlserver 排序规则的问题相关的知识,希望对你有一定的参考价值。

我要使用php语言在编码为utf-8的页面存储和读取sqlserver 2008中的数据,但是涉及到汉字的时候就出现乱码。当将页面编码换成gb2312时,就正常显示汉字。但是我必须使用utf-8,那么数据库的排序规则该为什么呢?
其默认为Chinese_PRC_CU_AS

alter table [表名] alter column [列名] [类型] COLLATE Chinese_PRC_CI_AS

[类型] 最好选用 nvarchar,nchar

存储数据时如果出现乱码,可能情况如下:
1.提交到数据库的字符是乱码
2. 数据库排序规则不支持该字符集
3.数据库表字段的类型设计不合适,最好选用nvarchar,nchar
4.插入字符串时强制存储格式 insert into [表名] ([字段1]) values(N'字符串'),最好在字符串前指定 N追问

数据库字段类型就是nvarchar,但是php页面若用utf-8时,中文显示就是乱码

追答

你可以打印SQL语句,在本机调试,数据库跟页面没关系,只跟提交到数据库的SQL有关系,然后按上面的方法测试。。。

参考技术A SQL Server存储汉字是采用的UCS2编码方案,官方对于需要用UTF-8编码显示汉字的解决方法如下
在服务器端,应使用 Session.CodePage 属性或 @Codepage 指令来指定客户端的编码方案。例如,codepage = 65001 指定了 UTF-8 编码方案

这是ASP里边的解决方案,PHP不熟悉,估计也应该有类似设置吧?

SQL Server 2005 排序规则问题

【中文标题】SQL Server 2005 排序规则问题【英文标题】:SQL Server 2005 collation issue 【发布时间】:2010-10-25 02:22:57 【问题描述】:

我有两个表,它们使用不同的排序规则。不允许将不同排序规则的表中的列连接起来,例如下面的 SQL 是不允许的,

select table1column1 + table2column2 from ...

我的问题是,如何在不破坏表数据的情况下更改表的排序规则?

提前致谢, 乔治

【问题讨论】:

【参考方案1】:

如果需要,您可以随时更改列排序规则。

例如

select table1column1 collate database default  + table2column2 collate database default from ...

“数据库默认值”可以是您想要使用的任何排序规则。

您可以使用

永久更改列的排序规则
ALTER TABLE ... ALTER COLUMN Table1Column1
            varchar(50) COLLATE Latin1_General_CI_AS NOT NULL
GO

【讨论】:

酷,一个简单的问题,为什么 SQL Server 不允许连接具有不同排序规则的表中的两列?内因是什么? 内因是排序规则不同的两个字符串本质上是不兼容的。每个字符串必须只有一个排序规则,但 SQL Server 不能简单地猜测结果应该具有哪种排序规则,因此您必须指定它。 嗯,很明显:en.wikipedia.org/wiki/Collation,从那里开始,我建议阅读有关此主题的 SQL Server 2005 联机丛书:msdn.microsoft.com/en-us/library/ms143503.aspx。我想网上还有很多东西可以找到。 简单地说,排序规则对字符串就像语言对单词一样。每个单词都完全是一种语言。您不能以任何有意义的方式连接不同语言的两个单词,您必须先翻译其中一个单词,以便它们的语言匹配。 右键单击 SSMS 中的列,它会将排序规则显示为其属性之一。在数据库属性的常规选项卡中,99% 的列与其数据库具有相同的排序规则。

以上是关于sqlserver 排序规则的问题的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server转换数据库的排序规则

SQLSERVER的中文排序规则(转帖+亲自实践)

SQL server中如何更改排序规则

SQLSERVER 修改数据实例的排序规则

SQL Server 2005 排序规则问题

SQL Server 排序规则的影响