【问题标题】:Automatically trimming length of string submitted to MySQL自动修剪提交给 MySQL 的字符串长度
【发布时间】:2011-03-12 07:25:57
【问题描述】:

当我向 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>

table 字段 PatientPhone 是 VARCHAR(20)

如果我不以编程方式验证提交并且只是输入一个 30 个字符长的表单值,我会出错(当我认为它会做的只是存储前 20 个字符时)

Data truncation: Data too long for column 'patientPhone1' at row 8

当我使用向导设置数据库时,我记得选择了 innodb 以及事务和传统仿真(如果我没记错的话,这是推荐的)

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您的意思是您想在数据定义脚本中设置它,例如在创建表时?根据文档,您不能这样做。也许您可以在插入数据之前使用触发器来处理数据?像这样的东西(我不能保证下面的代码确实有效):

    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);
    

    【讨论】:

      【解决方案2】:

      默认情况下,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=''使用具有超级权限的帐户连接并发出SET GLOBAL sql_mode='modes'

      【讨论】:

      • 我得到 STRICT_TRANS_TABLES, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION 所以我猜第一位说的是它的传统模式?如果我以超级用户身份登录并执行 set global sql_mode='' 认为会取消模式,但如果我然后运行 ​​SELECT @@SESSION.sql_mode 我得到完全相同的输出
      • 是的,STRICT_TRANS_TABLES 暗示在大多数情况下,MySQL 会在通常截断输入的地方给出错误消息。如果您无法设置 sql_mode 的全局值,那么最好在每次连接时自动执行设置会话 SQL 模式的任务。虽然我的偏好是让数据库以传统模式运行并检查应用程序逻辑中的输入长度。
      • 即使我将我的 sql_mode 清除为 '' 如果我输入的字符串太长,我也会得到同样的错误
      【解决方案3】:

      只需将数据库字段大小设置为您想要接受的最大大小即可。
      如果您想要最多 20 个字符,请将其设置为 varchar(20) 或 char(20)。
      请注意 utf8 输入,其中一些字符占据 2 个位置而不是 1 个位置。
      但是,正如您可以在 cmets 中阅读的那样。选择一个 utf8 字符集可以解决这个问题。

      如果您说的是空格...那么通常您应该在代码中只使用一个位置来执行插入/更新/删除查询。在这个地方,您可以轻松地以编程方式应用您想要的任何过滤器,并确保它将应用于您的所有插入。

      【讨论】:

      • 如果将字段的字符集设置为 utf-8,则它接受 20 个字符而不是 20 个字节。
      • 另外,请注意 UTF-8 字符最多可能占用 4 个字节。正如 Naktibalda 所说,在这种情况下这不应该是一个问题。
      • 4 字节 UTF-8 字符仅在 MySQL 5.5 及更高版本中接受,如果您使用字符集“utf8mb4”。在以前的版本中,使用 UTF8 字符集,MySQL 会给出错误输入字符的错误。
      猜你喜欢
      • 2012-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-28
      相关资源
      最近更新 更多