【问题标题】:SQL Server unable to trim data of COLLATION type SQL_Latin1_General_CP1_CI_ASSQL Server 无法修剪 COLLATION 类型 SQL_Latin1_General_CP1_CI_AS 的数据
【发布时间】:2013-09-19 00:27:31
【问题描述】:

我们有两个数据库,一个是具有 COLLATION - SQL_Latin1_General_CP1_CI_AS 的旧数据库,一个具有 COLLATION - Latin1_General_CI_AI 的新数据库(可能是默认数据库)。

两个数据库中都有一个简单的 Table1(ID (int), code(nvarchar(50)))。我想做的是比较两个表的数据并找到丢失或额外的记录。

Sample data in old table has code like : 'Code1      '
Sample data in new table has code like : 'Code1  '

我需要做的是比较两个数据(来自“名称”列)。我无法从旧表中删除数据 -

示例:

SELECT LTRIM(RTRIM([Name])) from [OLDDB].dbo.Table1
returns 'Code1     '       -- NOT as expected (probably due to mis-match in charset

SELECT LTRIM(RTRIM([Name])) from [NEWDB].dbo.Table1
'Code1'                    -- as expected

我希望这是有道理的。此外,即使我在列级别更改了 COLLATION,我仍然无法获得 ltrim / rtrim 工作!

谢谢。

【问题讨论】:

  • 我刚刚使用这些精确的排序规则创建了两个数据库,尝试了代码并没有遇到这种行为。 OLDDB 中的列数据是否可能包含其他类型的空格,例如 RTRIM 不修剪的 CHAR(160)?用SELECT Name FROM OLDDB.dbo.Table1 WHERE CHARINDEX(CHAR(160), Name) <> 0检查它
  • 谢谢。是的,它似乎是 char(160),我检查了上面的查询并返回非零。无论如何要以此为基础推导出 LTRIM RTRIM?我相信在每个列级别更改 COLLATION 是一个漫长的过程!

标签: sql-server collation trim


【解决方案1】:

如果 CHAR(160) 是问题所在,那么您不必更改排序规则。只需将那些 CHAR(160) 替换为适当的空格,然后 RTRIM 即可工作。

SELECT LTRIM(RTRIM(REPLACE([Name], CHAR(160), ' '))) from [OLDDB].dbo.Table1

【讨论】:

    【解决方案2】:

    试试下面的更新,希望能解决问题。

    更新 [OLDDB].dbo.Table1 设置名称 RTRIM(replace(NAME, char(160), char(32)))

    【讨论】:

    • DB 太大,对所有表应用更改并非易事。
    猜你喜欢
    • 1970-01-01
    • 2021-11-28
    • 2011-02-16
    • 2019-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多