2010-07-06 87 views
3

当我向mySQL数据库提交表单字段时,是否有办法将数据库设置为自动丢弃超过数据字段长度的任何数据?自动修剪提交给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和事务性和传统仿真向导中的DB(这是建议,如果我没记错的话)

回答

-4

编辑:

CREATE TRIGGER chopdata BEFORE INSERT ON mytable 
    FOR EACH ROW BEGIN 
    NEW.myfield = SELECT SUBSTRING(NEW.myfield,1,20) 
    END; 

否则,您可以通过在查询/程序直串砍掉的最大长度:这不应该被接受的答案。

错误答案:MySQL将截断任何超过指定列宽的插入值。

永远不要依赖此行为。

+0

不是在上述情况下,这是我的问题 – Saul 2010-07-06 13:54:39

+3

切换您的MySQL模式不使用STRICT。这里是文档链接: http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html – 2010-07-06 14:23:38

+0

似乎不是5.6中的默认值 – shrimpwagon 2014-10-27 19:44:33

0

只需设置数据库字段大小到要接受最大尺寸。
如果您想要最多20个字符,然后将其设置为varchar(20)或char(20)。
只要注意utf8输入,其中一些字符需要2个地方而不是一个。
但是,你可以阅读评论。选择一个utf8字符集将解决这个问题。

如果您正在谈论空白处......那么通常假设您的代码只使用一个位置来执行插入/更新/删除查询。在这个地方,你可以很容易地应用程序化的任何你想要的过滤器,并确保它将被应用到你的所有插入。

+3

如果将字段字符集设置为utf-8,则它接受20个字符而不是20个字节。 – Naktibalda 2010-07-06 13:05:40

+0

另请注意,UTF-8字符最多可能需要4个字节。这并不是说在这种情况下这应该是一个问题,因为Naktibalda说。 – 2010-07-06 13:37:22

+0

tnx两者 - 学习evry的一天。 – 2010-07-06 14:35:12

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'

+0

我得到 STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION 所以我想第一位说它的传统模式? 如果我以超级用户身份登录并执行设置全局sql_mode =''认为会取消模式,但是如果我运行SELECT @@ SESSION.sql_mode,我会得到完全相同的输出 – Saul 2010-07-06 13:23:10

+1

是的,'STRICT_TRANS_TABLES'意味着在大多数情况下情况下,MySQL会给出一个错误消息,通常会截断输入。如果您不能设置sql_mode的全局值,那么最好在每次连接时自动执行设置会话SQL模式的任务。尽管我的偏好是让数据库以传统模式运行并检查应用程序逻辑中输入的长度。 – Hammerite 2010-07-06 13:33:01

+0

即使我清除我的sql_mode为''如果我把一个字符串这太长我得到相同的错误 – Saul 2010-07-06 14:00:40

8

你的意思是你想在数据定义脚本中设置这个例如创建表时?根据文件,你不能这样做。也许你可以使用触发器来处理插入之前的数据?像这样的东西(我不能garantuee,下面居然代码工作):

SELECT SUBSTRING('your very long string goes here',1,20);