我试图在我的 SQL Server 2008 上重现您所谓的“错误”(请参阅下面的代码)。结果,它完全按照您的预期工作。我很惊讶你一开始没有提供完整的代码。
更新:将完整索引的语言更改为葡萄牙语并收到相同的结果。它显示“类似错误的行为”。
更新:
为什么会这样?
MS 在 SQL Server 2008 中引入了新的分词器,葡萄牙语就是其中之一。
我的意思是,SQL 在搜索单词时应该忽略换行符
才不是。我不认为这是全文引擎的默认行为。至少不能接受。
更新:看起来这种行为可以在所有新的断路器中看到。
-- Create auxiliary table to test languages
IF OBJECTPROPERTY(object_id('test_languages'), 'IsUserTable') IS NOT NULL
DROP TABLE test_languages;
GO
CREATE TABLE test_languages
(
componenttype varchar(30),
componentname int,
clsid uniqueidentifier,
fullpath varchar(2000),
version_no varchar(50),
manufacturer varchar(50)
);
-- Populate Auxiliary table
INSERT INTO test_languages
EXEC ('exec sp_help_fulltext_system_components ''wordbreaker''');
-- Create Cursor and check how languages work with sys.dm_fts_parser
DECLARE MY_CURSOR CURSOR FOR
select
componentname
from test_languages
INNER JOIN
sys.fulltext_languages
on sys.fulltext_languages.lcid=test_languages.componentname
ORDER BY name
DECLARE @RESULT varchar(max)
DECLARE @test_var NVARCHAR(20)
SET @test_var='"word' + CHAR(13) + 'test"'
DECLARE @componentname int
OPEN MY_CURSOR
FETCH NEXT FROM MY_CURSOR
INTO @componentname
WHILE (@@FETCH_STATUS = 0)
BEGIN
SELECT name+ ' - '+
CASE test_languages.version_no
WHEN '6.0.6001.18000'
THEN 'Updated Language 6.0.6001.18000'
WHEN '12.0.9735.0'
THEN 'Old Language 12.0.9735.0'
WHEN '12.0.6828.0'
THEN 'Old Language 12.0.6828.0'
END
AS [Language_Type]
FROM test_languages
INNER JOIN
sys.fulltext_languages
ON sys.fulltext_languages.lcid=test_languages.componentname
WHERE lcid=@componentname
SELECT display_term
FROM sys.dm_fts_parser (@test_var, @componentname, 0, 0)
FETCH NEXT FROM MY_CURSOR
INTO @componentname
END;
-- clean up the mess
CLOSE MY_CURSOR
DEALLOCATE MY_CURSOR;
DROP TABLE test_languages;
由 MS 决定这是否可以接受。不过,您可以通过支持服务提交票证。
如果我的用户在我的表格上插入带有换行符的行会发生什么
(这很常见,因为他们可以写任何他们想要的东西,因为
该字段是备注字段)?
所见即所得
有什么办法可以改正吗?
也许您需要上传自己的断字系统或降级到 SQL Server 2005。
总之祝你好运!
USE
master
GO
CREATE
DATABASE Test_Brazil -- Portuguese (Brazil)
COLLATE
Latin1_General_100_CI_AI
USE
Test_Brazil
GO
CREATE
TABLE [dbo].[test](
[test] [varchar] (100) NOT NULL
)
ON [PRIMARY]
CREATE UNIQUE NONCLUSTERED INDEX [test] ON [dbo].[test]
(
[test]
ASC
)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 100) ON [PRIMARY]
GO
CREATE
FULLTEXT CATALOG ft AS DEFAULT;
CREATE
FULLTEXT INDEX ON test(test)
KEY INDEX test
WITH STOPLIST = SYSTEM;
sp_fulltext_database 'enable'
insert into test values ('word' + Char(9) + 'test') --Tab
insert into test values ('word' + Char(10) + 'test') -- Line feed
insert into test values ('word' + Char(13) + 'test') -- Carriage return
insert into test values ('word test')
-- wait 3 sec
select test from test where contains(test, '"word test"')
-- 4 rows returned
DROP FULLTEXT INDEX ON dbo.test
CREATE
FULLTEXT INDEX ON dbo.test
(
test Language 2070 -- Portuguese
)
KEY INDEX test;
-- 2 rows returned
select * from test where contains(test, '"word test"')