SQL BIGINT の最大値を検索します。このスクリプトは、数年前に 32 ビット マシンで作成したときにオーバーフローしていました。今ではほとんど問題はありません!
http://dev.mysql.com/doc/refman/5.0/en/numeric-type-overview.html
http://www.laprbass.com/RAY_integer_overflow.php
<?php // RAY_integer_overflow.php
error_reporting(E_ALL);
echo "<pre>\n";
// CONNECTION AND SELECTION VARIABLES FOR THE DATABASE
$db_host = "localhost"; // PROBABLY THIS IS OK
$db_name = "??"; // GET THESE FROM YOUR HOSTING COMPANY
$db_user = "??";
$db_word = "??";
// OPEN A CONNECTION TO THE DATA BASE SERVER
// MAN PAGE: http://us2.php.net/manual/en/function.mysql-connect.php
if (!$dbcx = mysql_connect("$db_host", "$db_user", "$db_word"))
{
$errmsg = mysql_errno() . ' ' . mysql_error();
echo "<br/>NO DB CONNECTION: ";
echo "<br/> $errmsg <br/>";
}
// SELECT THE MYSQL DATA BASE
// MAN PAGE: http://us2.php.net/manual/en/function.mysql-select-db.php
if (!$db_sel = mysql_select_db($db_name, $dbcx))
{
$errmsg = mysql_errno() . ' ' . mysql_error();
echo "<br/>NO DB SELECTION: ";
echo "<br/> $errmsg <br/>";
die('NO DATA BASE');
}
// CREATE A TABLE AND ALTER IT TO A HIGH INDEX NUMBER
$sql = "CREATE TEMPORARY TABLE noise ( id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY ) ENGINE=MEMORY";
if (!$res = mysql_query($sql)) die(mysql_error());
$sql = "ALTER TABLE noise AUTO_INCREMENT = 2147483646";
if (!$res = mysql_query($sql)) die(mysql_error());
// INSERT DATA TO ADD TO THE AUTO_INCREMENT INDEX
$kount = 0;
while ($kount < 15)
{
$sql = "INSERT INTO noise () VALUES ()";
if (!$res = mysql_query($sql)) die(mysql_error());
$nid = mysql_insert_id($dbcx);
var_dump($nid);
$kount++;
}
私の概算によると、1 秒あたり 1,000 の割合でメッセージを集約し、AUTO_INCREMENT キーに UNSIGNED BIGINT を使用している場合、約 5 億 7000 万年でオーバーフローが発生します。したがって、多かれ少なかれ、1 秒あたり 1,000,000,000 の速度でメッセージを収集している場合、問題は短い順序で発生することになります。おそらく、今から約 570 年後です。しかし、良いニュースは、毎秒 100,000 の割合でメッセージを収集している場合でも、VC コミュニティからお金が投げつけられるということです!