NopCommerce学习:MSSQL 2005 排序规则导致中文编码错误

这两天学习电子商务开源项目NopCommerce,她的确做的很好,在电子商务开源项目中应该算是很棒的.

官方站点: http://www.nopcommerce.com/

中文社区:http://www.nopchina.com/

 

但是,里面博客部分,默认是将整篇文章内容一起加载到页面,感觉不是很好,于是,用SQL过滤文章内容中的HTML标签后,返回前150个字符(学习园子首页),SQL函数如下: 


--  过滤HTML标签
CREATE   FUNCTION   [ dbo ] . [ SQL_Filter ] ( @input   varchar ( 4000 ))
RETURNS   varchar ( 4000 )
AS
    
BEGIN
        
declare  
        
@Result   varchar ( 4000 ),
        
@start   int ,
        
@end   int ,
        
@len   int

        
set   @input   =   @input   +   ' <> '
        
set   @Result   =   ''
        
set   @len = len ( @input )
        
set   @start   =   charindex ( ' < ' , @input , 1 )
        
set   @end   =   charindex ( ' > ' , @input , @start )
        
while ( @start < @end )
            
begin         
                
if ( @start <> 1
                  
set   @Result   =   @Result   +   substring ( @input , 1 , @start - 1 )
                
set   @len   =   @len   -   @end
                
set   @input   =   substring ( @input , @end + 1 , @len )
                
set   @start   =   charindex ( ' < ' , @input , 1 )
                
set   @end   =   charindex ( ' > ' , @input , @start )
            
end
    
RETURN   replace ( @Result , ' &nbsp; ' , '' )
    
END

 

 

但运行后发现了一个问题,如果文章内容中包含中文,则编码成了问号(?)。

然后测试了不同几个函数, 结果一致,中文编码错误。

 

 应此判断,应该为数据库设置问题,检查后发现,该数据库的排序规则不是:Chinese_PRC_CI_AS (企业管理器 - 数据库属性 - 常规 - 维护 - 排序规则)。

知道原因后,开始解决问题,重启SQL服务,执行以下语句(将排序规则更改为:Chinese_PRC_CI_AS):

alter   database  NopCommerce collate Chinese_PRC_CI_AS

 

  但由于数据库里已有对象使用了数据库排序规则,应此出现如下错误:


消息 
5075 ,级别  16 ,状态  1 ,第  1  行
对象
' CK_Nop_ShoppingCart_Quantity '  依赖于 数据库排序规则。
消息 
5075 ,级别  16 ,状态  1 ,第  1  行
对象
' NOP_splitstring_to_table '  依赖于 数据库排序规则。
消息 
5072 ,级别  16 ,状态  1 ,第  1  行
ALTER   DATABASE  失败。无法将数据库  ' NopCommerce '  的默认排序规则设置为 Chinese_PRC_CI_AS。

 

 

 最终解决办法 - 不知道该解决办法会不会影响数据库原有结构,而导致程序可能发生异常?(以下代码由网友 阿枫 提供帮助): 


use  NopCommerce

-- 删掉对象
ALTER   TABLE   [ dbo ] . [ Nop_ShoppingCartItem ]    drop   constraint   [ CK_Nop_ShoppingCart_Quantity ]
drop   function   [ dbo ] . [ NOP_splitstring_to_table ]
go
-- 更改数据库默认语言
alter   database  NopCommerce collate Chinese_PRC_CI_AS;
go
-- 新建对象
ALTER   TABLE   [ dbo ] . [ Nop_ShoppingCartItem ]    WITH   CHECK   ADD    CONSTRAINT   [ CK_Nop_ShoppingCart_Quantity ]   CHECK   (( [ quantity ] > ( 0 )))
GO

ALTER   TABLE   [ dbo ] . [ Nop_ShoppingCartItem ]   CHECK   CONSTRAINT   [ CK_Nop_ShoppingCart_Quantity ]
GO

CREATE   FUNCTION   [ dbo ] . [ NOP_splitstring_to_table ]
(
    
@string   NVARCHAR ( 1000 ),
    
@delimiter   CHAR ( 1 )
)
RETURNS   @output   TABLE (
    data  NVARCHAR ( 256 )
)
BEGIN
    
DECLARE   @start   INT @end   INT
    
SELECT   @start   =   1 @end   =   CHARINDEX ( @delimiter @string )

    
WHILE   @start   <   LEN ( @string +   1   BEGIN
        
IF   @end   =   0  
            
SET   @end   =   LEN ( @string +   1

        
INSERT   INTO   @output  (data) 
        
VALUES ( SUBSTRING ( @string @start @end   -   @start ))
        
SET   @start   =   @end   +   1
        
SET   @end   =   CHARINDEX ( @delimiter @string @start )
    
END
    
RETURN
END

 

你可能感兴趣的:(MSSQL)