Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
插入UUID时发生SQL截断错误_Sql_Database_Uuid_Truncate - Fatal编程技术网

插入UUID时发生SQL截断错误

插入UUID时发生SQL截断错误,sql,database,uuid,truncate,Sql,Database,Uuid,Truncate,我正在构建一个数据库驱动的PHP应用程序,它使用UUID存储每一行数据。应用程序当前使用以下查询生成UUID: SELECT UUID() 它生成的输出类似于84058227-294c-11e3-916a-7a7919b2b2bc 许多在线来源建议将UUID存储在二进制(16)中,以提高整体应用程序性能。但是,当我尝试将UUID插入数据库时,我收到以下错误: Warning: #1265 Data truncated for column 'x' at row x 我意识到发

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

    SELECT UUID()
它生成的输出类似于
84058227-294c-11e3-916a-7a7919b2b2bc

许多在线来源建议将UUID存储在
二进制(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'];
    }

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


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

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

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