Menu

Showing posts with label Database. Show all posts
Showing posts with label Database. Show all posts

Thursday, September 16, 2021

[Database] ฐานข้อมูลจังหวัด อำเภอ ตำบล และรหัสไปรษณีย์ของไทย
[Database] Province, District (Amphur), Sub District (Tambon) and Postal Code (Zip Code) database of Thailand

Original Version

ฐานข้อมูลจังหวัด อำเภอ ตำบล และรหัสไปรษณีย์ของไทย ข้อมูลเดิมอ้างอิงจาก

https://raw.githubusercontent.com/Cerberus/Thailand-Address/master/thailand-address.sql

http://thai-db-download.blogspot.com/2015/02/devscriptcase-sql.html

ดาวน์โหลดได้ที่

https://raw.githubusercontent.com/arzeroid/code2now/master/sql/zipcode/thailand_with_zipcode%20(dirty).sql

หมายเหตุ ฐานข้อมูลนี้มีทั้งข้อมูลเก่าและใหม่ของตำบลและอำเภอรวมกันอยู่ โปรดตรวจสอบอีกครั้งก่อนใช้งาน

Cleansing Version

ฐานข้อมูลจังหวัด อำเภอ ตำบล และรหัสไปรษณีย์ของไทยที่มีการ clean data เอาข้อมูลเก่าออกให้เหลือแต่ข้อมูลปัจจุบัน

ดาวน์โหลดได้ที่

https://raw.githubusercontent.com/arzeroid/code2now/master/sql/zipcode/thailand_with_zipcode%20(clean).sql

Wednesday, April 15, 2020

[MySQL] ระวังการใช้ mysqldump ในการ backup ฐานข้อมูลขนาดใหญ่ จะเกิดข้อผิดพลาด "Packet Too Large"
[MySQL] Warning: Using mysqldump to Backup Large Database May Cause "Packet Too Large" Error

หลังจากที่รัน mysqldump เพื่อ backup ฐานข้อมูลของโปรเจคนึง ก็เกิดข้อผิดพลาดดังนี้
mysqldump: Error 2020: Got packet bigger than 'max_allowed_packet' bytes when dumping table `failed_jobs` at row: 79
ข้อผิดพลาดข้างต้นเป็นข้อผิดพลาด Packet Too Large ที่มีระบุอยู่ใน MySQL Reference Manual ซึ่งสามารถเข้าไปอ่านเพิ่มเติมได้ที่ https://dev.mysql.com/doc/refman/5.7/en/packet-too-large.html

วิธีแก้ไขข้อผิดพลาดดังกล่าวมี 2 วิธีดังนี้
  1. เพิ่ม --max_allowed_packet=512M ตอนสั่งรัน mysqldump
  2. เพิ่ม max_allowed_packet=512M ไปในส่วนของ [mysqldump] ในไฟล์ my.cnf
หมายเหตุ 512M เป็นเพียงขนาดตัวอย่างเท่านั้น ขนาดใหญ่สุดที่เป็นไปได้ คือ 1024M

Wednesday, April 8, 2020

[Database - MySQL] วิธีการแก้ปัญหา Syntax Error เมื่อทำการสร้าง Procedure
[Database - MySQL] How to Fix Syntax Error when Creating a Procedure

สมมติว่า เราต้องการสร้าง procedure ด้วย SQL statement ข้างล่างนี้
CREATE PROCEDURE `my_procedure` (IN `_year` INT, IN `_month` INT)
    NO SQL
BEGIN
    SELECT * FROM my_table WHERE year = `_year`and month = `_month`;
END;
อย่างไรก็ตาม statement นี้ไม่สามารถรันได้ทุกฐานข้อมูล

บางฐานข้อมูลจะแสดงข้อผิดพลาดตามรูปข้างล่างนี้


[Database - MySQL] การ Backup และ Restore ฐานข้อมูล MySQL ผ่านทาง Command Line
[Database - MySQL] How to Backup and Restore MySQL Databases via Command Line

การ Backup ฐานข้อมูล MySQL

การ backup ฐานข้อมูล เราจะใช้คำสั่ง mysqldump ซึ่งเป็นโปรแกรมที่ถูกลงมาพร้อมกับ MySQL software โดยเราจะใช้คำสั่งดังนี้
mysqldump -u [username] -p [database_name] > [filename].sql
โดย option ที่ใส่ได้มีดังนี้
  • -u [username] ใช้ระบุชื่อผู้ใช้งานที่ใช้ login เข้าฐานข้อมูล
  • -p[password] ใช้ระบุรหัสผ่านที่ใช้ login เข้าฐานข้อมูล
    (ถ้าไม่ระบุ [password] ระบบจะถามรหัสเมื่อสั่งรัน)
  • -h [host] ใช้ระบุ host ของฐานข้อมูล (ถ้าไม่ระบุ ค่าจะเป็นเครื่องที่รันคำสั่ง)
  • -P [port] ใช้ระบุ port ของฐานข้อมูล (ถ้าไม่ระบุ ค่าจะเป็น 3306)

การ Restore ฐานข้อมูล MySQL

การ restore ฐานข้อมูล เราจะใช้คำสั่ง mysql ร่วมกับไฟล์ SQL ที่ได้จากคำสั่ง backup ข้างต้น โดยเราจะใช้คำสั่งดังนี้
mysql -u [username] -p --default-character-set=[charset] [database_name] < [filename].sql
โดย option ที่ใส่ได้มีดังนี้
  • -u [username] ใช้ระบุชื่อผู้ใช้งานที่ใช้ login เข้าฐานข้อมูล
  • -p[password] ใช้ระบุรหัสผ่านที่ใช้ login เข้าฐานข้อมูล
    (ถ้าไม่ระบุ [password] ระบบจะถามรหัสเมื่อสั่งรัน)
  • ---default-character-set=[charset] ใช้ระบุ character set ของข้อมูลที่จะนำเข้าฐานข้อมูล

Thursday, May 30, 2019

[Database - SQL] วิธีคำนวณระยะทางระหว่างพิกัด (Latitude, Longitude) 2 พิกัด
[Database - SQL] How to Calculate Distance between 2 Points of (Latitude, Longitude)

เนื่องจากผิวโลกมีความโค้ง จึงต้องใช้ haversine formula ในการคำนวณระยะทางที่สั้นที่สุดระหว่างพิกัดสองพิกัดบนผิวโลก

สมมติว่า ตาราง location ประกอบด้วยคอลัมน์ lat และ lon ที่เก็บค่า Latitude และ Longitude ตามลำดับของแต่ละพิกัด และพิกัดที่สนใจอยู่ที่ตำแหน่ง ([lat0], [lon0])

เราสามารถค้นหาพิกัดที่อยู่ใกล้เคียงกับพิกัดที่เราสนใจ ภายในรัศมี 1 กิโลเมตร โดยใช้ SQL ดังต่อไปนี้

SELECT *, 6373  * 2 * ATAN2(
    SQRT(
        POW(SIN((lat - [lat0]) * PI() / 180 / 2), 2) +
        COS(ABS([lat0]) * PI() / 180) *
        COS(ABS(lat) * PI() / 180) *
        POW(SIN((lon - [lon0]) * PI() / 180 / 2), 2)
    ),
    SQRT(1-(
        POW(SIN((lat - [lat0]) * PI() / 180 / 2), 2) +
        COS(ABS([lat0]) * PI() / 180) *
        COS(ABS(lat) * PI() / 180) *
        POW(SIN((lon - [lon0]) * PI() / 180 / 2), 2))
    )
) as dist
FROM `location`
HAVING  dist < 1 
ORDER BY dist

โดยที่
  •     6373 เป็นรัศมีของโลก มีหน่วยเป็นกิโลเมตร
  •     lat เป็นค่า Latitude ของ record ในตาราง location
  •     lon เป็นค่า Longitude ของ record ในตาราง location
  •     [lat0] เป็นค่า Latitude ของพิกัดที่เราสนใจ
  •     [lon0] เป็นค่า Longitude ของพิกัดที่เราสนใจ
  •     dist เป็นระยะทางระหว่างพิกัดที่เราสนใจกับพิกัดของ record ในตาราง location มีหน่วยเป็นกิโลเมตร

Tuesday, April 23, 2019

[Database - SQL] วิธีการ Query หา Record ที่มีค่ามากที่สุดหรือน้อยที่สุด
[Database - SQL] How to Query a Record that Has Maximum or Minimum Value

สมมติว่า user_login เป็นตารางในฐานข้อมูลที่มีคอลัมน์ login_at สำหรับเก็บวันเวลาที่ผู้ใช้งาน login เข้าใช้งานระบบ

ในกรณีที่เราต้องการหา record ของการ login เข้าใช้งานล่าสุดของผู้ใช้งานทุกคน (login_at มีค่ามากที่สุด) เราสามารถใช้คำสั่ง SQL ตามด้านล่างนี้ได้เลย
SELECT * 
FROM user_login 
WHERE EXISTS (
    SELECT 1
    FROM user_login AS ul
    GROUP BY user_id
    HAVING user_id = users_login.user_id AND
        MAX(login_at) = user_login.login_at
)
ในทางตรงกันข้าม ถ้าเราต้องการหา record ของการ login เข้าใช้งานครั้งแรกสุดของผู้ใช้งานทุกคน (login_at มีค่าน้อยที่สุด) เราสามารถใช้คำสั่ง SQL ตามด้านล่างนี้ได้เลย
SELECT * 
FROM user_login 
WHERE EXISTS (
    SELECT 1
    FROM user_login AS ul
    GROUP BY user_id
    HAVING user_id = users_login.user_id AND
        MIN(login_at) = user_login.login_at
)

Sunday, December 23, 2012

[C#] วิธีการเชื่อมต่อ ORACLE โดยใช้ C# .Net4.0
[C#] How to Connect to ORACLE with C# .Net4.0

หลังจากทำการสร้างโปรเจคใหม่ใน Visual C# 2010
After creating new project in Visual C# 2010

ไปที่ Project บนเมนู แล้วเลือก Properties...
Go to Project on menu bar then select Properties...