代码之家  ›  专栏  ›  技术社区  ›  Mobile Ben

避免varchar上mysql 1406错误的最佳方法

  •  0
  • Mobile Ben  · 技术社区  · 7 年前

    我的服务器使用MySQL DB,通过C++连接到它。我正接近生产阶段,我花了一些时间试图打破一些东西,作为强化服务器的一部分。

    我需要做的一个操作项是看看如果我用一个长度超过 VARCHAR .例如,如果我有一列定义为 VARCHAR(4) 然后将其设置为字符串“hello”。

    当然,这会引发一个异常,错误代码为1406(列的数据太长)。

    我想知道的是,是否有一种好的或标准的方法来防御这种情况?显然,有一件事是检查字符串长度并手动截断。我可以这样做,但是有许多表和列 瓦卡尔 . 所以我担心的是如果其中一列使用 瓦尔查尔 其长度是否增加(即代码可维护性)

    请注意,服务器会预先进行一些验证。我只是想防御一个微妙的错误或角落的情况,让一些东西通过。

    表上的其他几个选项是禁用strict,这样它将发出警告并截断或转换 瓦卡尔 TEXT .

    我想知道一些事情。

    • 有没有建议的方法来处理这种情况?
    • 禁用严格的缺点是什么?
    • 是否值得(并且可能)在运行时查询数据库 瓦卡尔 长度?请注意,我正在使用C++连接器。我想我也可以编写一个在编译之前运行的工具,它可以提取 瓦卡尔 用于生成表的SQL代码的长度。但那让我想知道我是不是在过度设计这个。

    我现在只是在整理可能的方法,并认为我会从那些有更多MySQL经验的人那里寻求建议。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Steffen Johnson    7 年前

    作为经验数据库工程师,我建议结合以下两种策略: 1)如果您知道有一个机会,不管多小,varchar(4)的数据可能会超过4,那么将varchar字段设置为大于4。例如,如果您希望字段的值可以高达8,那么将该字段设置为varchar(10)。使用varchar字段而不是char的好处是varchar只使用它需要的任何存储。 2)如果数据总是大于varchar字段长度,那么您应该修改自己的异常处理程序,以捕获1406错误。要使异常正常工作,您需要针对如何处理异常提出某种策略。例如,您可以向用户发送一个错误,并要求他们修复该问题;您可以接受数据,但将其截断,使其适合字段;或者您可以将该错误发送到日志文件,以便在以后得到修复。