Tôi có hai lĩnh vực để lưu trữ dữ liệu định vị, định nghĩa là tăng gấp đôi trong cơ sở dữ liệu MySQL của tôi:Strange giá trị thay đổi khi lưu dữ liệu double-type (geolocation) vào cơ sở dữ liệu
`address_geo_latitude` float(10,6) NOT NULL,
`address_geo_longitude` float(10,6) NOT NULL
Và tôi đang sử dụng Yii2 của double
validator trên giá trị được truyền bởi người sử dụng:
public function rules()
{
return [
[['address_geo_latitude', 'address_geo_longitude'], 'double', 'min'=>0, 'max'=>360]
];
}
(mặc dù các bài kiểm tra của tôi dường như được chứng minh, rằng vấn đề này không có gì để làm với Validators Yii2)
trong thử nghiệm I'v e quan sát kỳ lạ thay đổi các giá trị, tức là (?):
359.90
trở thành359.899994
(0,000006
chênh lệch),359.80
trở thành359.799988
(0,000012
chênh lệch),311.11
trở thành311.109985
(0,000015
chênh lệch),255.55
trở thành255.550003
(-0,000003
khác biệt),205.205
trở thành205.205002
(-0,000002
khác biệt),105.105
trở thành105.105003
(-0,000003
khác biệt).
nhưng:
359.899994
vẫn359.899994
,311.109985
vẫn311.109985
,311
vẫn311
,255
vẫn255
,200
hài cốt200
,75.75
vẫn75.75
,11.11
vẫn11.11
.
Tôi đang thiếu gì? Tôi không thể nhìn thấy bất kỳ mô hình hoặc logic nào đằng sau chúng.
Đây có phải là do tôi có khai báo trường không đúng của MySQL cho loại dữ liệu này không? Nếu có, thì điều gì là đúng? Vài câu trả lời khác nhau:
- Database/SQL: How to store longitude/latitude data?
- What datatype to use when storing latitude and longitude data in SQL databases?
- What is the ideal data type to use when storing latitude/longitudes in a MySQL database?
gợi ý, rằng việc sử dụng float(10,6)
là lựa chọn tốt nhất, nếu không sử dụng MySQL của spatial extensions.
xét nghiệm của tôi dường như được chứng minh, rằng vấn đề này không có gì để làm với Validators Yii2, bởi vì giá trị vẫn còn đúng cho đến khi được đọc từ cơ sở dữ liệu:
print_r(Yii::$app->request->post()); //Correct!
print_r($lab->address_geo_latitude); //Correct!
if ($lab->load(Yii::$app->request->post(), 'Lab') && $lab->save()) {
print_r($lab->address_geo_latitude); //Correct!
$lab2 = $this->findModel($lab->id);
print_r($lab2->address_geo_latitude); //<-- HERE! Incorrect!
}
Câu hỏi của tôi là trái với this one. Số của tôi tăng, không thua, chính xác! Và chỉ cho một số nhất định, không phải lúc nào.
là các giá trị đúng trong * mysql * sau khi bạn lưu lại? – Tony
@Tony Xin lỗi, tôi không hiểu câu hỏi của bạn, bởi vì tôi chưa bao giờ nói bất cứ điều gì về lần lưu thứ hai, chỉ về lần đọc thứ hai (đọc lại). Có, ngay sau khi giá trị '$ model-> save()' được lưu dưới dạng '$ model-> address_geo_latitude = 311.11' hóa ra thực sự lưu trữ/có giá trị' 311.109985' trong cột 'address_geo_latitude'. – trejder