当我向mySQL数据库提交表单字段时,是否有办法将数据库设置为自动丢弃超出数据字段长度的任何数据?
我知道我可以以编程方式执行此操作,但是数据库是否可以设置为丢弃多余的而不会抛出错误?
为清晰起见编辑
继承我的插入声明
<cfquery datasource='#arguments.dsn#' name="addPatient">
INSERT INTO patients(patientFirstname
,patientLastname
,nhsNumber
,patientDOB
,patientTitle
,address1
,address2
,address3
,address4
,postcode
,patientPhone1
)
VALUES (<cfqueryparam value="#arguments.patientFirstname#" cfsqltype="CF_SQL_LONGVARCHAR"/>
,<cfqueryparam value="#arguments.patientLastname#" cfsqltype="CF_SQL_LONGVARCHAR"/>
,<cfqueryparam value="#arguments.nhsNumber#" cfsqltype="CF_SQL_LONGVARCHAR"/>
,<cfqueryparam value="#arguments.patientDOB#" cfsqltype="CF_SQL_TIMESTAMP"/>
,<cfqueryparam value="#arguments.patientTitle#" cfsqltype="CF_SQL_LONGVARCHAR"/>
,<cfqueryparam value="#arguments.address1#" cfsqltype="CF_SQL_VARCHAR"/>
,<cfqueryparam value="#arguments.address2#" cfsqltype="CF_SQL_LONGVARCHAR"/>
,<cfqueryparam value="#arguments.address3#" cfsqltype="CF_SQL_LONGVARCHAR"/>
,<cfqueryparam value="#arguments.address4#" cfsqltype="CF_SQL_LONGVARCHAR"/>
,<cfqueryparam value="#arguments.postcode#" cfsqltype="CF_SQL_LONGVARCHAR"/>
,<cfqueryparam value="#arguments.patientPhone1#" cfsqltype="CF_SQL_VARCHAR"/>
)
</cfquery>
表格字段patientPhone是VARCHAR(20)
如果我没有通过progamatically验证提交,只是在30个字符长的表格值中爆炸我错了(当我认为它会做的只是存储前20个字符)
Data truncation: Data too long for column 'patientPhone1' at row 8
当我使用向导设置数据库时,我记得选择了innodb和事务性以及传统模拟(如果我没记错的话,建议使用它)
答案 0 :(得分:8)
您是否想要在数据定义脚本中设置此项,例如在创建表时?根据文档,你不能这样做。也许您可以在插入数据之前使用触发器来处理数据?像这样的东西(我不能保证下面的代码实际上有效):
CREATE TRIGGER chopdata BEFORE INSERT ON mytable
FOR EACH ROW BEGIN
NEW.myfield = SELECT SUBSTRING(NEW.myfield,1,20)
END;
否则,您可以在查询/过程中直接使用子字符串来删除最大长度:
SELECT SUBSTRING('your very long string goes here',1,20);
答案 1 :(得分:7)
MySQL默认情况下已经这样做了!它不应该在我看来,但确实如此。
如果它为您提供错误消息而不是仅截断数据,则可能是传统模式。运行SELECT @@SESSION.sql_mode
并查看其内容。如果它吐出来
STRICT_TRANS_TABLES, STRICT_ALL_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER
那么它处于传统模式;每次连接时发出问题SET SESSION sql_mode=''
,或使用具有SUPER权限的帐户进行连接并发出SET GLOBAL sql_mode='modes'
。
答案 2 :(得分:-1)
只需将数据库字段大小设置为您要接受的最大大小 如果你想要最多20个字符,那么将它设置为varchar(20)或char(20) 请注意utf8输入,其中一些字符需要2个而不是1个 但是,你可以在评论中阅读。选择utf8字符集将解决这个问题。
如果您正在谈论空格...那么通常您会假设在代码中只使用一个位置来执行插入/更新/删除查询。在这个地方,您可以轻松地以编程方式应用您想要的任何过滤器,并确保它将应用于您的所有插入。
答案 3 :(得分:-4)
编辑:这不应该是接受的答案。
答案不正确:MySQL将截断超出指定列宽的任何插入值。
永远不应该依赖此行为。