标题几乎说明了一切。请考虑下表:
CREATE TABLE foobar (
[guid] UNIQUEIDENTIFIER NULL
);
以及以下代码段:
$stmt = $dbh->prepare("
INSERT INTO foobar (
[guid]
) VALUES (
:guid
)
");
$stmt->bindValue(':guid', '0x5E73EFFFFBE83864DD8A23D32A9AB226', PDO::PARAM_INT);
$stmt->execute();
它是一个字符串而不仅仅是一个纯整数的原因是因为它的生成方式;像这样:
/**
* Generates a windows-style guid
* Code here is adapted from http://guid.us/GUID/PHP
*/
function GUID() {
if (function_exists('com_create_guid')) {
return com_create_guid();
} else{
mt_srand((double)microtime()*10000); //optional for php 4.2.0 and up.
$charid = strtoupper(md5(uniqid(rand(), true)));
$uuid = substr($charid, 0, 8)
.substr($charid, 8, 4)
.substr($charid,12, 4)
.substr($charid,16, 4)
.substr($charid,20,12);
return "0x".$uuid;
}
}
对SQL服务器进行概要分析表明该查询如下所示:
INSERT INTO foobar (
[guid]
) VALUES (
'0x5E73EFFFFBE83864DD8A23D32A9AB226'
)
此查询无法正常运行。
我正在努力弄清楚如何插入此值。我试图通过base_convert()将值转换为十进制,但是当我这样做时会出现精度损失。当然有一种更直接的方法可以插入这个值吗?
有什么建议吗?
答案 0 :(得分:0)
好的,所以当然写出问题可以提供解决方案。简而言之,我应该永远不会改变生成GUID的方法。应该做的是以下几点:
function GUID() {
if (function_exists('com_create_guid')) {
return com_create_guid();
} else{
mt_srand((double)microtime()*10000); //optional for php 4.2.0 and up.
$charid = strtoupper(md5(uniqid(rand(), true)));
$hyphen = chr(45);// "-"
$uuid = chr(123)// "{"
.substr($charid, 0, 8).$hyphen
.substr($charid, 8, 4).$hyphen
.substr($charid,12, 4).$hyphen
.substr($charid,16, 4).$hyphen
.substr($charid,20,12)
.chr(125);// "}"
return $uuid;
}
}
然后,按如下方式更改插入查询:
INSERT INTO foobar (
[guid]
) VALUES (
CAST('{5E73EFFF-FBE8-3864-DD8A-23D32A9AB226}' AS UNIQUEIDENTIFIER)
)
我错误地认为这不适合投射。