2009-07-18 29 views
8

Tôi có một chuỗi trong PHP (đến từ một số nguồn dữ liệu), đại diện cho một số nguyên không được định dạng 32 bit. Tôi cần lưu trữ nó vào cơ sở dữ liệu MySQL dưới dạng đã ký số nguyên 32 bit, để sau này tôi có thể lấy nó từ PHP và sử dụng nó dưới dạng hằng số nguyên có dấu (có thể âm) (vì PHP không có số nguyên chưa ký).Làm thế nào để đúc một số nguyên 32 bit từ unsigned để đăng nhập vào MySQL hoặc PHP?

Vì vậy, những gì tôi cần là một phương pháp chuyển đổi, cho PHP hoặc MySQL. Nó không nên phụ thuộc vào nền tảng (không có vấn đề về cuối/32/64-bit).

tôi biết làm thế nào để chuyển đổi một số nguyên ký thành unsigned sử dụng MySQL:

select CAST((-1062726980 & 0xFFFFFFFF) AS UNSIGNED INTEGER); 
+------------------------------------------------------+ 
| CAST((-1062726980 & 0xFFFFFFFF) AS UNSIGNED INTEGER) | 
+------------------------------------------------------+ 
|           3232240316 | 
+------------------------------------------------------+ 

Nhưng tôi không thể có được nó làm việc theo cách khác xung quanh (lưu ý: MySQL sử dụng 64-bit số học khi làm phôi).

Cảm ơn.

Trả lời

0

này:

$val = (bccomp("2147483647", $val) < 0) ? bcsub($val, "4294967296") : $val; 

dường như làm việc, mặc dù nó hơi chậm.

3

Nếu bạn chỉ truyền số này sang số nguyên trong PHP, nó sẽ thực hiện thủ thuật.

echo (int)3232240316 . "\n"; 

cho

-1062726980 

Lưu ý: nếu bạn muốn đúc một int ký hợp đồng với một int unsigned trong PHP, chỉ cần làm điều này:

$number += 4294967296; 

Ví dụ:

$number = -1062726980; 
echo $number . "\n"; 
$number += 4294967296; 
echo $number . "\n"; 

cung cấp:

-1062726980 
3232240316 
+1

Xin lỗi, nhưng điều đó sẽ không hoạt động trên một số hệ thống 64 bit, trong đó PHP int là 64 bit theo mặc định. – Alex

Các vấn đề liên quan