Mysql数据类型仅限1个字符

时间:2016-01-26 15:11:05

标签: mysql sql mysqli

我正在使用mysql,只想在表字段中插入一个字母。什么是只接受一个字符的数据类型。

我不想使用VARCHAR(1),因为它会截断剩余的字符。我希望如果输入是1个字符。它将插入,否则它将不会插入表

3 个答案:

答案 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

?  或者它不适用于您正在使用的系统?