我正在使用mysql,只想在表字段中插入一个字母。什么是只接受一个字符的数据类型。
我不想使用VARCHAR(1)
,因为它会截断剩余的字符。我希望如果输入是1个字符。它将插入,否则它将不会插入表
答案 0 :(得分:2)
在mysql中,数据类型本身无法控制是否尝试将字段插入/更新为更长(无效)的数据,而不是字段定义允许的结果导致错误或警告。
在mysql中,您需要将sql模式设置为严格的sql模式之一,如sql mode上的mysql文档所述。
如果严格模式无效,MySQL会为其插入调整后的值 值无效或缺失并产生警告(参见章节 13.7.5.40,“显示警告语法”)。在严格模式下,您可以使用INSERT IGNORE或UPDATE IGNORE生成此行为。
因此,varchar(1)和char(1)都是正确的定义,但是,您需要启用严格的sql模式才能插入/更新无效数据以产生错误。在配置文件中设置sql模式或使用set语句在链接文档中进行了描述:
要在服务器启动时设置SQL模式,请使用--sql-mode =“modes” 命令行上的选项,或选项文件中的sql-mode =“modes” 如my.cnf(Unix操作系统)或my.ini(Windows)。模式是一个 由逗号分隔的不同模式的列表。要清除SQL模式 显式地,使用--sql-mode =“”将其设置为空字符串 命令行,或选项文件中的sql-mode =“”。 ......要改变 运行时的SQL模式,设置全局或会话sql_mode系统 变量使用SET语句:
SET GLOBAL sql_mode = 'modes'
;
SET SESSION sql_mode = 'modes'
;
答案 1 :(得分:2)
如果将列长度设置为更长(例如,255),则可以添加一个检查新字段长度的触发器。如果大于1,则可以触发错误。
对于测试示例: -
CREATE TABLE IF NOT EXISTS `insert_test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`sometext` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
--
-- Triggers `insert_test`
--
DROP TRIGGER IF EXISTS `length_check_trigger`;
DELIMITER //
CREATE TRIGGER `length_check_trigger` BEFORE INSERT ON `insert_test`
FOR EACH ROW BEGIN
DECLARE msg VARCHAR(255);
IF LENGTH(NEW.sometext) > 1 THEN
SET msg = "DIE: String Too Long.";
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
END IF;
END
//
DELIMITER ;
您可以将邮件更改为您想要的内容。您还需要一个类似的触发器来捕获更新。
答案 2 :(得分:1)
您是否尝试过数据类型:
TINYTEXT
? 或者它不适用于您正在使用的系统?