0

如何在 Firebird 服务器中使表列不区分大小写?

我正在使用此代码,但它不工作..

con.opne();
cmd = new FbCommand("ALTER TABLE asco ALTER COLUMN Final_Model VARCHAR(30) COLLATE Latin1_General_CS_AS NULL", con);
cmd.ExecuteNonQuery();
con.close();

错误:

ERROR:Dynamic SQL Error
SQL error code = -104
Token unknown - line 1, column 43
VARCHAR
4

1 回答 1

2

你的说法有几个问题。首先,根据 Interbase 6.0 语言参考(可从Firebird 站点的文档部分获得)部分ALTER TABLE(第 28 页),正确的语法是:

ALTER TABLE table <operation> [, <operation> ...];
<operation> = {...
  | ALTER [COLUMN] column_name <alt_col_clause>
  ...}
<alt_col_clause> = {...
  | TYPE new_col_datatype
  ...}

请注意,new_col_datatype没有进一步扩展(datatype但是在第 29 页)。换句话说,声明至少应该是:

ALTER TABLE asco 
  ALTER COLUMN Final_Model 
    TYPE VARCHAR(30)

请注意TYPE列名和数据类型之间的关系。Language Reference 中 BNF 产生的顺序可能会让您认为您也可以更改列的排序规则,不幸的是您不能。

因此,如果要更改排序规则,则必须使用正确的排序规则创建一个新列,复制内容然后删除旧列(并将新列重命名为旧列的名称)。另请参阅Firebird-support list 上的此线程

最后我想指出 1)Latin1_General_CS_AS是区分大小写的排序规则,而不是不敏感的排序规则,如您的问题和 2) Firebird 不知道排序规则Latin1_General_CS_AS(最接近您需要的可能是默认排序规则WIN_PTBRFR_FR_CI_AI,否则您可以创建一个自己使用CREATE COLLATION)。

于 2012-11-21T16:08:07.253 回答