在插入时自动将字符串剪辑到适当的长度

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (8)

我在MySQL中有一个包含各种VARCHAR字段的表。我想通过PHP从表单中插入一些用户数据。显然,如果我知道PHP中的字段长度,我可以限制那里的数据长度substr()。但是那种违反DRY(存储在MySQL中的字段长度以及我的PHP脚本中的常量)。有没有办法让我配置一个INSERT,以便它自动切断过长的字符串,而不是失败?

编辑:当我有过长的字符串时,它在PHP / PDO中失败(或至少导致异常)。不知道我在PHP / PDO中要做什么,所以它做对了。

编辑2:呃。这是错误的做法; 即使我让它在INSERT上工作正常,如果我想检查一个重复的字符串,它将无法正常匹配。

提问于
用户回答回答于

您可以使用列元数据来检查字符串长度。(PDOStatement上的PHP手册 - > getColumnMeta

以这种方式获取整个表的元数据

$query = $conn->query("SELECT * FROM places");
$numcols = $query->columnCount();

$tablemeta = array();
for ($i = 0; $i < $numcols; $i++) {
    $colmeta = $query->getColumnMeta($i);
    $tablemeta[$colmeta['name']] = $colmeta;
}
用户回答回答于

实际上,默认情况下,MySQL会将字符串截断为列宽。它会生成警告,但允许插入。

mysql> create table foo (str varchar(10));
mysql> insert into foo values ('abcdefghijklmnopqrstuvwxyz');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> show warnings;
+---------+------+------------------------------------------+
| Level   | Code | Message                                  |
+---------+------+------------------------------------------+
| Warning | 1265 | Data truncated for column 'str' at row 1 | 
+---------+------+------------------------------------------+
mysql> select * from foo;
+------------+
| str        |
+------------+
| abcdefghij | 
+------------+

如果设置严格SQL模式,它会将警告转换为错误并拒绝插入。

您的评论:SQL模式是MySQL服务器配置。它可能不是导致它的PDO,但另一方面它是可能的,因为任何客户端都可以为其会话设置SQL模式。

您可以使用以下语句检索当前的全局或会话sql_mode值:

SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;

默认值应为空字符串(不设置模式)。您可以在my.cnf文件中设置SQL模式,使用--sql-modemysqld选项或使用SET语句。

更新:MySQL 5.7及更高版本默认设置严格模式。请参阅https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html

扫码关注云+社区

领取腾讯云代金券