【问题标题】:SQL Truncate Error when Inserting UUID插入 UUID 时出现 SQL 截断错误
【发布时间】:2013-10-05 16:36:42
【问题描述】:

我正在构建一个数据库驱动的 PHP 应用程序,它使用 UUID 来存储每一行​​数据。应用程序当前使用以下查询生成 UUID:

    SELECT UUID()

生成类似于84058227-294c-11e3-916a-7a7919b2b2bc 的输出。

许多在线资源建议将 UUID 存储在 BINARY(16) 中以提高整体应用程序性能。但是当我尝试将 UUID 插入数据库时​​,我收到以下错误:

    Warning: #1265 Data truncated for column 'x' at row x

我意识到发生此错误是因为 UUID 太大而无法存储列,并且可以通过简单地增加列可能存储的字符数量来轻松解决此问题(例如:BINARY(20)),但我担心这样做可能会在未来降低应用程序的性能。

考虑到这么多在线资源建议使用BINARY(16) 来存储 UUID,我假设我犯了一个错误。

有人可以指点我正确的方向吗?

更多信息,这里是我正在使用(在 PHP 中)将数据插入数据库的代码:

    //PDO Query
    $this->query(
        INSERT INTO users
            (
                user_id,        //the UUID is stored in this column
                taxonomy_id,
                user_email,
                user_password,
                user_salt,
                user_activation_key,
                user_is_administrator
            )
            VALUES(?,?,?,?,?,?,?)
            ',
            array(
                $this->uuid(),    //method that generates UUID
                $taxonomy_id,
                $user_email,
                $user_password,
                $user_salt,
                $user_activation_key,
                $user_is_administrator
            )
        )
    );

以及生成每个UUID的方法:

    public function uuid()
    {
        $uuid = $this->query("SELECT UUID() AS uuid");
        return $uuid[0]['uuid'];
    }

【问题讨论】:

    标签: sql database uuid truncate


    【解决方案1】:

    UUID 的基础值是一个 128 位数字,它可以存储为 binary(16),因为 8*16 >= 128。但是,您正在使用的内置 SQL 函数 UUID(假设 MySQL ...您没有命名 RDBMS)将 128 位数字呈现为 36 个字符的字符串,这是 UUID 的正常人类可读形式。因此,您需要将其存储在长度 >= 36 的文本字段中,例如 varchar(36)

    除非您的应用程序要生成大量数据和查询,否则二进制字段中的 16 个字节与字符字段中的 36 个字节之间的差异不会影响您的性能。其他问题,如索引和正确的查询设计(尤其是在使用 MySQL 时的提示)将对您的整体性能产生更大的影响。

    【讨论】:

      猜你喜欢
      • 2010-11-05
      • 1970-01-01
      • 2013-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-02
      • 1970-01-01
      相关资源
      最近更新 更多