如何确保列值始终以大写形式添加?

How to make sure that the column value is always added in Uppercase?

我有一个现有的列 host,并希望确保列值 host 始终添加到 Uppercase

我正在使用 Alter Table 命令如下:

ALTER TABLE `mydb`.`myTable` 
CHANGE COLUMN `host` `host`
VARCHAR(255) GENERATED ALWAYS AS (UPPER()) STORED;

这会导致错误,我无法更改该列。

Operation failed: There was an error while applying the SQL script to the database. ERROR 1582: Incorrect parameter count in the call to native function 'UPPER' SQL Statement: ALTER TABLE mydb.myTable CHANGE COLUMN host host VARCHAR(255) GENERATED ALWAYS AS (UPPER()) VIRTUAL

我想确保向前移动 host 中插入的值始终在 uppercase 中。 我想通过在运行时更新 uppercase 中的值来实现这一点。 我不想添加任何 constraint,因为在 lowercase.

中输入 host 值时会导致错误

不完全清楚您要做什么。

如果要在 table 上设置一个约束,只允许在 host 中使用大写字母,请使用检查约束:

alter table mytable
    add constraint chk_host_upper
    check (host rlike '^[A-Z]*$')
;

这可以防止将小写字符写入该列;尝试这样做会导致运行时错误。

另一方面,如果您想创建一个新列,即 returns host 的大写值,而不考虑实际的列代码:

alter table mytable
     add column host_upper varchar(50)  -- same as the original column
     as (upper(host))
;

通过手头的设置,您可以在需要大写值时查询新列 host_upper


最后:如果您想在 insert 秒内将输入值即时转换为大写,那么您需要一个触发器:

delimiter //

create trigger mytrigger
before insert on mytable
for each row
begin
    set new.host = upper(new.host);
end
//

分隔符;

您可以只为 host 列分配不区分大小写的排序规则:

ALTER TABLE mydb.myTable MODIFY host VARCHAR(255)
CHARACTER SET latin1
COLLATE latin1_swedish_ci;

现在插入时使用的 host 的大小写无关紧要,您可以使用任何大小写与此列进行比较。如果您仍然需要 查看 host 视为大写,则只需使用 UPPER():

SELECT UPPER(host) AS host_upper
FROM myTable;