【问题标题】:Special Character in SQLSQL中的特殊字符
【发布时间】:2012-12-04 21:15:08
【问题描述】:

我在 SQL Server 2008 R2 的表中插入特殊字符时遇到问题。 关键是,当我尝试在表中插入带有字符 º 的字符串(例如 3 ELBOW 90º LONG RADIUS)时,它看起来像这样:3 ELBOW 90� LONG RADIUS,并且当我尝试选择所有包含字符 � 的行结果为空。

我尝试通过以下方式使用 ASCII 进行选择: select * from itemcode where description like '%'+char(63)+'%'

并让它知道该符号的 ASCII 是 63:

选择 ASCII('�')

但这不起作用。 我必须怎么做才能选择所有具有该字符的行,我应该怎么做才能使 SQL 识别字符 º?

谢谢

【问题讨论】:

  • 你试过字符 167 吗?
  • 字段的数据类型是varchar还是nvarchar?如果你不使用它,你可能想试试 nvarchar。
  • 也可能是你的SQL客户端有问题,要么传输错误的值,要么显示不正确。

标签: sql-server ascii


【解决方案1】:

当我运行这个时:

print ascii('º')

我得到 186 作为 ascii 码值,所以试试:

select * from YourTable Where Description like '%'+char(186)+'%'

要查看所有 ascii 代码,请运行以下命令:

;WITH AllNumbers AS
(
    SELECT 1 AS Number
    UNION ALL
    SELECT Number+1
        FROM AllNumbers
        WHERE Number<255
)
SELECT Number,CHAR(Number) FROM AllNumbers
OPTION (MAXRECURSION 255)

EDIT op 在评论中声明他们正在使用 nvarchar 列。

伪造ascii,使用NCHAR (Transact-SQL)输出度数符号:

print '32'+NCHAR(176)+'F' --to display it

select * from YourTable 
    Where Description like '%'+NCHAR(176)+'%' --to select based on it

并使用UNICODE (Transact-SQL) 获取值:

print UNICODE('°')

返回:

176

【讨论】:

  • 运行SELECT DATABASEPROPERTYEX('YOUR_DATABASE_NAME', 'Collation') SQLCollation;,我得到SQL_Latin1_General_CP1_CI_AS,所以你可能会得到不同的东西。
  • 如果您使用 nvarchar,如另一条评论中所述,您需要忘记 SQL Server 的 ASCII() 命令,记住它代表 American Standard Code for Information Interchange,并且在很久以前就已设置国际化被考虑并且不包括足够的特殊字符。您需要使用 UNICODE ('ncharacter_expression')
  • 当我运行 SELECT DATABASEPROPERTYEX('YOUR_DATABASE_NAME', 'Collat​​ion') SQLCollat​​ion 我得到 Latin1_General_CI_AS
【解决方案2】:

degree symbol

U+00B0 ° degree sign (HTML: &#176; &deg;)

不是 ASCII 字符,通常需要一个 NVARCHAR 列和一个 N'' 字符串文字。 (支持符号的代码页等除外)

63 是 question mark 的代码,它是 ASCII 反问号的后备:

select UNICODE('�') => 63
select UNICODE(N'�') => 65533

其中 65533 是 Unicode Replacement Character,用于显示无法转换或显示的字符。

【讨论】:

  • 但是我怎样才能选择所有包含那个 Unicode 替换字符的行呢?我试过 select * from itemcode where description like '%'+char(65533)+'%' 但不起作用
  • 你应该插入你的数据,这样替换字符甚至不会被存储。试试 N'°' 而不是 '°'。
  • 感谢您的回复,但如果信息已经存储并且我想查看所有存在此问题的行,我该怎么办?
  • 使用 NCHAR(65533) 创建 Unicode 字符:N'%'+NCHAR(65533)+N'%'
【解决方案3】:
select top 10 * from table_name 
where tbl_colmn like N'%'+  NCHAR(65533) + N'%'

函数 NCHAR(65533) 将返回您要查找的字符。

【讨论】:

  • 不适合我。文本是 - '34��������'。 SELECT unicode(SUBSTRING(text, 3, 1)) => 结果:65533SELECT * FROM [dbo].[bla] WHERE [text] like N'%['+nchar(65533)+N']%' => rusult:0 行。但是,我知道超过 19k 行带有 � 字符。
【解决方案4】:

除了确保它是 NVARCHAR 之外,我还会使用类似的东西

选择(N'�')

How to display special characters in SQL server 2008?

【讨论】:

    【解决方案5】:

    我知道这是旧的,但最近遇到了同样的问题,并找到了解决方案here

    “我知道在 SQL 中查找或删除它的最佳方法是使用二进制排序规则检查它。例如”

    Declare @Foo Table(PK int primary key identity, MyData nvarchar(20));
    Insert @Foo(MyData) Values (N'abc'), (N'ab�c'), (N'abc�')
    Select * From @Foo Where MyData Like N'%�%'
    
    -- Find rows with the character
    Select * From @Foo
    Where CharIndex(nchar(65533) COLLATE Latin1_General_BIN2, MyData) > 0
    
    -- Update rows replacing character with a !
    Update @Foo
    set MyData = Replace(MyData, nchar(65533) COLLATE Latin1_General_BIN2, '!')
    
    Select * From @Foo
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多