sql-server - sql服务器: Compare varchar type value in where clause doesn't return results

标签 sql-server sql-server-2012 collation varchar

我在 AWS RDS 数据库服务中拥有 SQL Server 2012 Web 版。排序规则是默认排序规则:SQL_Latin1_General_CP1_CI_AS

在其中一个表中,我有一个 varchar(128) 类型的列 MODIFIED_BY - 列排序规则是默认的。

存储到此列中的常用值是 GUIDS,少数硬编码到系统 的值除外。正如您所知,它是一个用于存储审计跟踪事务的表,如果在迁移过程中进行了修改,我们将在其中存储 id 或 System

无论如何 - 上面的所有内容都只是上下文。现在奇怪的问题是:

如果我运行以下命令,我不会得到任何记录,尽管我应该有:

select *
from AUDIT_LOG_TRANSACTIONS alt
where lower(ltrim(rtrim(alt.MODIFIED_BY)))='system'

select *
from AUDIT_LOG_TRANSACTIONS alt
where lower(ltrim(rtrim(alt.MODIFIED_BY)))=convert(varchar,'system')

select *
from AUDIT_LOG_TRANSACTIONS alt
where lower(ltrim(rtrim(alt.MODIFIED_BY)))=convert(varchar(128),'system')

如果运行以下命令,我会获得记录:

select *
from AUDIT_LOG_TRANSACTIONS alt
where alt.MODIFIED_BY like '%System%'

select *
from AUDIT_LOG_TRANSACTIONS alt
where lower(ltrim(rtrim(CAST(alt.MODIFIED_BY AS nvarchar(max)))))='system'

更新
这是表创建脚本:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[AUDIT_LOG_TRANSACTIONS](
    [AUDIT_LOG_TRANSACTION_ID] [int] IDENTITY(1,1) NOT NULL,
    [DATABASE] [nvarchar](128) NOT NULL,
    [TABLE_NAME] [nvarchar](261) NOT NULL,
    [TABLE_SCHEMA] [nvarchar](261) NOT NULL,
    [AUDIT_ACTION_ID] [tinyint] NOT NULL,
    [HOST_NAME] [varchar](128) NOT NULL,
    [APP_NAME] [varchar](128) NOT NULL,
    [MODIFIED_BY] [varchar](128) NOT NULL,
    [MODIFIED_DATE] [datetime] NOT NULL,
    [AFFECTED_ROWS] [int] NOT NULL,
    [SYSOBJ_ID]  AS (object_id([TABLE_NAME])),
PRIMARY KEY CLUSTERED 
(
    [AUDIT_LOG_TRANSACTION_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[AUDIT_LOG_TRANSACTIONS] ADD  DEFAULT (db_name()) FOR [DATABASE]
GO

ALTER TABLE [dbo].[AUDIT_LOG_TRANSACTIONS] ADD  CONSTRAINT [DF_AUDIT_LOG_TRANSACTIONS_MODIFIED_BY]  DEFAULT ('System') FOR [MODIFIED_BY]
GO

最佳答案

您的字符串中是否有一些“难以看到”的字符? 为了消除这种可能性,我将运行如下查询:

select alt.*, LEN(alt.MODIFIED_BY) as 'Length', cast(alt.MODIFIED_BY as varbinary(max)) as 'Bytes' from AUDIT_LOG_TRANSACTIONS alt where alt.MODIFIED_BY like '%System%' 

检查“长度”和“字节”列是否符合您的预期。

关于sql-server - sql服务器: Compare varchar type value in where clause doesn't return results,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19942445/

相关文章:

sql-server - 在 SQL Server 中什么时候必须使用 NVARCHAR/NCHAR 而不是 VARCHAR/CHAR?

mysql - mysql 中可能有区分重音和不区分大小写的 utf8 排序规则吗?

MySQL - 区分大小写的文本的正确 "Collation"? UTF8-bin?

javascript - jQuery MaskMoney 插件和字段类型 Decimal(SQL SERVER 表)出现问题

sql-server - 如何将 "Implode"(反规范化/连接)多个列合并为单个列?

sql-server - 计算 SQL Server 数据库中的表数量

sql-server - 无法将行从一个数据库复制到 SQL Server 上不同服务器上的另一个数据库

stored-procedures - Try/Catch 无法捕获存储过程中的异常

visual-studio - 无法在 Visual Studio 中调试存储过程。 'Step Into Stored Procedure' 丢失

sql-server-2012 - SQL Server 和 Websphere MQ 的分布式事务