现在的位置: 首页 > 综合 > 正文

SQL Server全文索引关于varchar与nvarchar的问题

2018年05月21日 ⁄ 综合 ⁄ 共 1672字 ⁄ 字号 评论关闭

DROP TABLE test  
--建测试表  
CREATE TABLE test  
    (  
      id INT IDENTITY(1, 1) PRIMARY KEY ,  
      txtTitle1 VARCHAR(50) ,--这里用的是varchar  
     txtTitle2 NVARCHAR(50) ,--这里用的是nvarchar  
    )  
     
--插入50条数据  
DECLARE @i INT 
SET @i = 0  
WHILE @i < 50   
    BEGIN 
       INSERT  INTO test  
               ( txtTitle1, txtTitle2 )  
       VALUES  ( '柳永法', '柳永法')  
        SET @i = @i + 1  
    END 
--对test表建全文索引,列选择txtTitle1, txtTitle2。方法如下:  
--右击要建全文索引的表-->全文索引-->定义全文索引-->点几下"下一步"直到“选择表列”  
-->选中要建立全文索引的列-->下一步-->自动-->创建新目录(写上名称,选位置,其它自便)  
-->点几下"下一步"直到完成,这时系统会开始建全文目录,建好没有可以在当前数据库所在:  
--展开当前数据库-->存储-->全文目录-->右击,你刚才起的名,如果“重新生成”是灰色,  
--说明系统当前正在生成,如果可以点,说明生成完了

--针对varchar的列txtTitle1 只要查询里是以 '法' 结尾,都查不出记录来  
SELECT COUNT(id) FROM dbo.test WHERE CONTAINS(txtTitle1 ,'柳永法'); --0  
SELECT COUNT(id) FROM dbo.test WHERE CONTAINS(txtTitle1,'柳');   --50  
SELECT COUNT(id) FROM dbo.test WHERE CONTAINS(txtTitle1,'永');   --50  
SELECT COUNT(id) FROM dbo.test WHERE CONTAINS(txtTitle1,'法');   --0  
SELECT COUNT(id) FROM dbo.test WHERE CONTAINS(txtTitle1,'柳永');  --50  
SELECT COUNT(id) FROM dbo.test WHERE CONTAINS(txtTitle1,'永法');  --0  
SELECT  REPLICATE('-',20)  
--针对nvarchar的列txtTitle2 都可以查出全部记录  
SELECT COUNT(id) FROM dbo.test WHERE CONTAINS(txtTitle2,'柳永法'); --50  
SELECT COUNT(id) FROM dbo.test WHERE CONTAINS(txtTitle2,'柳');   --50  
SELECT COUNT(id) FROM dbo.test WHERE CONTAINS(txtTitle2,'永');   --50  
SELECT COUNT(id) FROM dbo.test WHERE CONTAINS(txtTitle2,'法');   --50  
SELECT COUNT(id) FROM dbo.test WHERE CONTAINS(txtTitle2,'柳永');  --50  
SELECT COUNT(id) FROM dbo.test WHERE CONTAINS((txtTitle1,txtTitle2),'永法');  --50

--在txttitle列末尾随便加一个字符  
UPDATE test SET txttitle1=txttitle1+' '      
--重建索引后,再执行上面的查询,结果都 是50
--通过以上示例得出结论:只要在设计字段时把varchar改成nvarchar,就可以解决我们的问题,且nvarchar有个好处就是:如果数据库服务器部署在非中文的系统上时,不会出现乱码问题。

 

抱歉!评论已关闭.