自动修剪提交给MySQL的字符串长度

Sau*_*aul 6 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>
Run Code Online (Sandbox Code Playgroud)

表字段patientPhone是VARCHAR(20)

如果我没有progamatically验证提交,只是在一个30个字符长的表单值爆炸我错了(当我认为它会做的只是存储前20个字符)

Data truncation: Data too long for column 'patientPhone1' at row 8
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*n P 11

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

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

否则,您可以在查询/过程中直接使用子字符串来删除最大长度:

SELECT SUBSTRING('your very long string goes here',1,20);
Run Code Online (Sandbox Code Playgroud)


Ham*_*ite 10

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
Run Code Online (Sandbox Code Playgroud)

然后是传统模式; SET SESSION sql_mode=''每次连接时发出问题,使用具有SUPER权限和问题的帐户进行连接SET GLOBAL sql_mode='modes'.


Ita*_*vka -1

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

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

  • 如果将字段的字符集设置为 utf-8,则它接受 20 个字符而不是 20 个字节。 (3认同)
  • 如果您使用字符集“utf8mb4”,则仅在 MySQL 5.5 及更高版本中接受 4 字节 UTF-8 字符。在以前的版本中,使用 UTF8 字符集时,MySQL 会给出有关错误输入字符的错误。 (3认同)