Mysql 将varchar()限制在a-z范围内

Mysql 将varchar()限制在a-z范围内,mysql,database,constraints,Mysql,Database,Constraints,我正致力于实现和设计我的第一个数据库,有很多列有名称和地址等 在这些列上放置检查约束似乎是合乎逻辑的,这样DB只接受字母数字范围内的值(不允许任何特殊字符) 我使用的是MySQL,据我所知,它不支持用户定义的类型,有没有一种简单的方法可以做到这一点 防止坏数据进入数据库似乎是值得的,但这种复杂的检查是否应该转移到应用程序上呢?如果您使用的是mysql,则不能使用检查约束(问题被标记为wth,所以我认为是这样的情况)-mysql不支持检查约束。语法中允许它们(与其他数据库中的DDL兼容),但在其他

我正致力于实现和设计我的第一个数据库,有很多列有名称和地址等

在这些列上放置
检查
约束似乎是合乎逻辑的,这样DB只接受字母数字范围内的值(不允许任何特殊字符)

我使用的是MySQL,据我所知,它不支持用户定义的类型,有没有一种简单的方法可以做到这一点


防止坏数据进入数据库似乎是值得的,但这种复杂的检查是否应该转移到应用程序上呢?

如果您使用的是mysql,则不能使用检查约束(问题被标记为wth,所以我认为是这样的情况)-mysql不支持检查约束。语法中允许它们(与其他数据库中的DDL兼容),但在其他方面会被忽略

您可以向表中添加一个触发器,该触发器在insert和update时触发,用于检查数据的符合性,但如果发现问题,则无法从mysql存储的进程引发异常

我使用了一种解决方法,即点击一张不存在的桌子,但是有一个能传达你想要的意思的名字,例如

update invalid_characters set col1 = 1;
希望阅读“table invalid_characters not existence”(表格无效字符不存在)消息的人能够理解这一点。

有一些方法允许您更改MySQL处理特定情况的方式(但这些还不够)

我会坚持在应用程序端进行数据验证,但如果您需要在数据库端进行验证,则有两种选择:

  • 这将验证和插入数据,不执行任何操作或通过调用
  • 这将验证数据并按照本文中的建议停止插入

为什么只将其约束为小写值?可以是小写或大写。最好在应用程序端执行所有此类错误检查和约束。@Cdeez我不同意。最佳实践是将可以在数据库中执行的任何检查移动到数据库中。它保持了更好的一致性,特别是当您的数据库支持多个应用程序时。在这种情况下,您可能会将其移到应用程序端,因为数据库无法很好地处理它,但这会使维护数据完整性变得更加困难,如果可以的话,应该尽量避免。@Cdeez:不,不是这样的。尽管MySQL的功能有限,但事实上是这样的——每一个其他DBMS创建一个检查约束都会更有效、更可靠地完成这项工作。谢谢你的提示。我确实在使用MySQL。