1

问题:我的公司正在使用 Liferay 6.0,它正在升级到 Liferay 6.1 GA2。在 6.0 中,我们在 SQL Server 数据库列中有大量行具有智能引号字符。在自动升级中,智能引号被替换为“?”。我们计划在升级之前对内容运行查找和替换 SQL 语句,以防止出现此问题。我编写了一个小型 Java 程序来查找字符的 ASCII 值。该字符在 ANSI(“A‎A”)中的显示与在 UTF-8(“A‎A”)中的显示不同。我在前面的句子中将智能引号字符夹在大写字母 A 之间。

public class CheckAscii {
    public static void main(String args[]) {
        asciiVals("A‎A"); //ANSI
        asciiVals("A‎A"); //UTF-8
    }
    static void asciiVals(String str) {
        System.out.println("Length of the string: " + str + " is " + str.length());
        for (int j=0; j<str.length(); j++){
            System.out.println("Ascii value of char " + str.charAt(j) + " : " + (int)str.charAt(j));
        }
        System.out.println("");
    }
}

输出是

字符串长度:A‎A 为 5
char A 的 Ascii 值:65 char 的 Ascii 值€
:226
char € 的 Ascii 值:8364
char Ž 的 Ascii 值:381
char A 的 Ascii 值:65

字符串的长度: A‎A 是 3
char A 的 Ascii 值:65 char ‎的
Ascii 值:8206
char A 的 Ascii 值:65

以下查询没有给我任何行,

SELECT [COLUMN] FROM [TABLE] where [COLUMN] like '%['+char(226)+']%'
SELECT [COLUMN] FROM [TABLE] where [COLUMN] like '%['+char(8364)+']%'
SELECT [COLUMN] FROM [TABLE] where [COLUMN] like '%['+char(381)+']%'
SELECT [COLUMN] FROM [TABLE] where [COLUMN] like '%['+char(8206)+']%'

此查询获取,

select CHAR(226), CHAR(8364), CHAR(381), CHAR(8206)

â null null null

我不知道如何在文本中查找这些字符。有谁知道如何在 SQL Server 中为智能引号形成搜索查询?

4

1 回答 1

0

如果数据类型实际上是 TEXT,首先将列转换为 VARCHAR(MAX),如下所示:

SELECT [COLUMN] FROM [TABLE] where CAST([COLUMN] AS VARCHAR(MAX)) like '%['+char(226)+']%'
SELECT [COLUMN] FROM [TABLE] where CAST([COLUMN] AS VARCHAR(MAX)) like '%['+char(8364)+']%'
SELECT [COLUMN] FROM [TABLE] where CAST([COLUMN] AS VARCHAR(MAX)) like '%['+char(381)+']%'
SELECT [COLUMN] FROM [TABLE] where CAST([COLUMN] AS VARCHAR(MAX)) like '%['+char(8206)+']%'
于 2013-09-03T21:32:25.170 回答