So sánh 2 kiểu dữ liệu datetime utf năm 2024

Dự án với hệ thống sử dụng MySQL cho cơ sở dữ liệu. Với thiết kế sử dụng UTF-8 encoding cho các table. Dự án đã release, chức năng đang hoạt động mượt mà thì một ngày đẹp trời, hệ thống quản lý lỗi bắn về 1 error message.

Mysql2::Error: Incorrect string value: '\xF0\xA0\xAE\xB7\xE5\xB2...' for column...

Sau một (vài) hồi tìm hiểu thì dev đưa ra kết luận: Do hệ thống hiện tại đang setting DB với charset = "utf8", mà thực ra với MySQL "utf8" lại không hề là UTF-8 như mong muốn thiết kế ban đầu.

Vậy utf8 của MySQL là gì

Theo như Document của MySQL định nghĩa thì

utf8 is an alias for the utf8mb3 character set.

The utf8mb3 character set has these characteristics:

・Supports BMP characters only (no support for supplementary characters)

・Requires a maximum of three bytes per multibyte character.

Applications that use UTF-8 data but require supplementary character support should use utf8mb4 rather than utf8mb3 (see Section 10.9.1, “The utf8mb4 Character Set (4-Byte UTF-8 Unicode Encoding)”).

https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8.html

https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8mb3.html

Ta thấy được vấn đề quan trọng nhất, đó là "utf8" của MySQL yêu cầu tối đa 3 bytes cho mỗi kí tự multibyte. Trong khi đó UTF-8 encoding lại có thể có từ 1 đến 4 bytes.

https://en.wikipedia.org/wiki/UTF-8

Nói ngắn gọn, cái thứ gọi là utf8 của MySQL chỉ encode được "một phần" của UTF-8. Và một ngày đẹp trời lỗi sẽ xảy ra khi xuất hiện 1 character insert vào DB có độ dài lớn hơn 3 bytes.

Tái hiện lại Bug

Thử tái hiện lại bug trên bằng cách insert 1 kí tự có mã U+1D306 (Là kí hiệu của TETRAGRAM FOR CENTRE (𝌆)) vào MySQL DB. Setting column của table được insert vào với collation = utf8_unicode_ci, charset = utf8

mysql> SET NAMES utf8; # just to emphasize that the connection charset is set to `utf8`
Query OK, 0 rows affected (0.00 sec)
mysql> UPDATE database_name.table_name SET column_name = 'foo𝌆bar' WHERE id = 9001;
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 1
mysql> SELECT column_name FROM database_name.table_name WHERE id = 9001;
+-------------+
| column_name |
+-------------+
| foo         |
+-------------+
1 row in set (0.00 sec)

Rõ ràng, khi tiến hành query lại data đã insert, phần nội dung đã bị cắt ngắn đi kí hiệu 𝌆 Bên cạnh có, khi kiểm tra warning của MySQL thì nhận được message tương tự ở trên

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level   | Code | Message                                                                      |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)

Tóm gọn thì:

  1. “utf8mb4” của MySQL mới có nghĩa là “UTF-8”.
  2. “utf8” của MySQL chỉ có nghĩa là “Một phần character encoding của UTF-8”. Quả là củ chuối.

Kết luận

Với việc tìm hiểu con bug này thì có thể rút ra được một số bài học

  1. Hệ thống cơ sở dữ liệu có các lỗi tinh vi và kỳ quặc, và bạn có thể tránh được rất nhiều lỗi bằng cách tránh các hệ thống cơ sở dữ liệu. (Yaoming)
  2. Còn nếu cần phải có database, thì thôi đừng có dùng MySQL hoặc MariaDB. Dùng PostgreSQL đi.
  3. Nếu vẫn nhất quyết dùng MySQL hoặc MariaDB, thì chớ bao giờ dùng “utf8”. Luôn dùng “utf8mb4” khi muốn encoding UTF-8.

Nguồn: https://medium.com/@adamhooper/in-mysql-never-use-utf8-use-utf8mb4-11761243e434 https://mathiasbynens.be/notes/mysql-utf8mb4

Đặt ngày (date) và giờ (time) trong JavaScript không khó, bài viết này sẽ chỉ cho bạn mọi thứ bạn cần biết.

  • Khung JavaScript là gì và một số khung JavaScript phổ biến
  • Hỏi đáp về ngôn ngữ JavaScript cùng lập trình viên
  • Học lập trình web nên học ngôn ngữ nào có tính ứng dụng cao?
  • Học lập trình web bắt đầu từ đâu sẽ mang lại hiệu quả tốt?
  • Cách định nghĩa và cấu trúc các hàm trong JavaScript

So sánh 2 kiểu dữ liệu datetime utf năm 2024

Làm việc với ngày tháng là một phần quan trọng của lập trình. Đối tượng date (ngày tháng) có sẵn được dùng để làm việc với ngày tháng và thời gian trong JavaScript. Các phương thức khác nhau của đối tượng date làm cho tác vụ này dễ dàng hơn rất nhiều.

Trong bài viết này, bạn sẽ tìm hiểu mọi thứ bạn cần biết về cách làm việc với ngày và giờ trong JavaScript. Hãy bắt đầu nào.

1. Làm việc với ngày và giờ trong JavaScript: Cách tạo đối tượng data

Bạn có thể tạo đối tượng date trong JavaScript bằng bốn cách sau:

1.1 new Date()

Hàm new Date() tạo một đối tượng date với ngày và giờ hiện tại.

let d = new Date();

console.log(d);

Đầu ra :

Mon Jan 03 2022 20:27:58 GMT+0530 (India Standard Time)

1.2 new Date(datestring)

Phương thức khởi tạo new Date(datestring) tạo một đối tượng date từ một chuỗi ngày tháng.

let d = new Date("2022-01-01");

console.log(d);

Đầu ra :

Sat Jan 01 2022 05:30:00 GMT+0530 (India Standard Time)

1.3 new Date(milliseconds)

Hàm new Date(milliseconds) tạo một đối tượng date bằng cách thêm mili giây vào thời gian bằng không. Tham số biểu thị thời gian đã trôi qua tính bằng mili giây kể từ ngày 1 tháng 1 năm 1970 theo giờ UTC.

let d1 = new Date(0);

console.log(d1);

let d2 = new Date(973436457364);

console.log(d2);

Đầu ra :

`console.log(d);`0

`console.log(d);`1

1.4 new Date(year, month, day, hours, minutes, seconds, milliseconds)

Hàm new Date(year, month, day, hours, minutes, seconds, milliseconds) tạo một đối tượng ngày với một ngày và giờ được chỉ định. Bảy tham số chỉ định năm, tháng, ngày, giờ, phút, giây và mili giây tương ứng.

`console.log(d);`2

console.log(d);

Đầu ra :

`console.log(d);`4

Bạn cũng có thể tạo một đối tượng date với sáu, bốn, ba hoặc hai tham số.

  1. Sáu tham số chỉ định năm, tháng, ngày, giờ, phút và giây.
  1. Năm tham số chỉ định năm, tháng, ngày, giờ và phút.
  1. Bốn tham số chỉ định năm, tháng, ngày và giờ.
  1. Ba tham số chỉ định năm, tháng và ngày.
  1. Hai tham số chỉ định năm và tháng.

Ghi chú :

  • JavaScript đếm các tháng từ 0 đến 11, tức là tháng 1 được biểu thị bằng 0 và tháng 12 được biểu thị bằng 11.
  • Nếu bạn chỉ định các giá trị nằm ngoài phạm vi trong đối tượng Date, nó sẽ không tạo ra lỗi mà nó sẽ tự động sửa chữa chính nó.

`console.log(d);`5

`console.log(d);`6

console.log(d);

Đầu ra :

`console.log(d);`8

\>>> Xem thêm: 10 Lý do hàng đầu để học JavaScript làm ngôn ngữ lập trình nền tảng

2. Làm việc với ngày và giờ trong JavaScript: Các phương thức get dữ liệu

Bạn có thể sử dụng các phương pháp sau để lấy thông tin từ một đối tượng date.

2.1 getFullYear()

Phương thức này trả về năm dưới dạng số có bốn chữ số (yyyy) theo giờ địa phương.

let d = new Date();

`Mon Jan 03 2022 20:27:58 GMT+0530 (India Standard Time)`0

Đầu ra :

`Mon Jan 03 2022 20:27:58 GMT+0530 (India Standard Time)`1

2.2 getMonth()

Phương thức này trả về tháng dưới dạng số (0-11) theo giờ địa phương.

let d = new Date();

`Mon Jan 03 2022 20:27:58 GMT+0530 (India Standard Time)`3

Đầu ra :

`Mon Jan 03 2022 20:27:58 GMT+0530 (India Standard Time)`4

2.3 getDate()

Phương thức này trả về ngày dưới dạng số (1-31) theo giờ địa phương.

let d = new Date();

`Mon Jan 03 2022 20:27:58 GMT+0530 (India Standard Time)`6

Đầu ra :

`Mon Jan 03 2022 20:27:58 GMT+0530 (India Standard Time)`7

2.4 getHours()

Phương thức này trả về giờ (0-23) theo giờ địa phương.

let d = new Date();

`Mon Jan 03 2022 20:27:58 GMT+0530 (India Standard Time)`9

Đầu ra :

`let d = new Date("2022-01-01");`0

2.5 getMinutes()

Phương thức này trả về phút (0-59) theo giờ địa phương.

let d = new Date();

`let d = new Date("2022-01-01");`2

Đầu ra :

`let d = new Date("2022-01-01");`3

2.6 getSeconds()

Phương thức này trả về giây (0-59) theo giờ địa phương.

let d = new Date();

`let d = new Date("2022-01-01");`5

Đầu ra :

`let d = new Date("2022-01-01");`6

2.7 getMilliseconds()

Phương thức này trả về mili giây (0-999) theo giờ địa phương.

let d = new Date();

`let d = new Date("2022-01-01");`8

Đầu ra :

`let d = new Date("2022-01-01");`9

2.8 getTime()

Phương thức này trả về thời gian tính bằng mili giây kể từ ngày 1 tháng 1 năm 1970.

let d = new Date();

`console.log(d);`1

Đầu ra :

`console.log(d);`2

2.9 getDay()

Phương thức này trả về ngày trong tuần dưới dạng số (0-6) theo giờ địa phương.

let d = new Date();

`console.log(d);`4

Đầu ra :

`console.log(d);`5

Lưu ý : Nếu bạn muốn làm việc với ngày UTC, bạn có thể sử dụng các phương pháp ngày sau: getUTCDate()​​​​​​​, getUTCDay()​​​​​​​, getUTCFullYear()​​​​​​​, getUTCHours()​​​​​​​, getUTCMilliseconds(), getUTCMinutes()​​​​​​​, getUTCMonth(), and getUTCSeconds().

\>>> Xem thêm: Sự khác biệt chính giữa JavaScript và Python bạn đã biết?

3. Làm việc với ngày và giờ trong JavaScript: Phương pháp đặt ngày trong JavaScript

Bạn có thể sử dụng các phương pháp sau để đặt một phần của đối tượng date.

3.1 setDate()

Phương pháp này đặt ngày dưới dạng số (1-31) cho một ngày cụ thể theo giờ địa phương.

let d = new Date();

`console.log(d);`7

console.log(d);

Đầu ra :

`console.log(d);`9

3.2 setFullYear()

Phương pháp này đặt năm cho một ngày cụ thể theo giờ địa phương.

let d = new Date();

`Sat Jan 01 2022 05:30:00 GMT+0530 (India Standard Time)`1

console.log(d);

Đầu ra :

`Sat Jan 01 2022 05:30:00 GMT+0530 (India Standard Time)`3

3.3 setHours()

Phương pháp này đặt giờ (0-23) cho một ngày cụ thể theo giờ địa phương.

let d = new Date();

`Sat Jan 01 2022 05:30:00 GMT+0530 (India Standard Time)`5

console.log(d);

Đầu ra :

`Sat Jan 01 2022 05:30:00 GMT+0530 (India Standard Time)`7

3.4 setMilliseconds()

Phương thức này đặt mili giây (0-999) cho một ngày cụ thể theo giờ địa phương.

let d = new Date();

`Sat Jan 01 2022 05:30:00 GMT+0530 (India Standard Time)`9

console.log(d);

Đầu ra :

`let d1 = new Date(0);`1

Tương tự, bạn có thể sử dụng các phương thức setMinutes()​​​​​​​, setMonth()​​​​​​​, and setSeconds() để đặt phút (0-59), tháng (0-11), và giây (0-59) tương ứng cho một ngày cụ thể theo giờ địa phương.

4. Làm việc với ngày và giờ trong JavaScript: Ví dụ về thời gian hiện tại của JavaScript

Một ví dụ đơn giản để in thời gian hiện tại của hệ thống:

`let d1 = new Date(0);`2

`let d1 = new Date(0);`3

`let d1 = new Date(0);`4

`let d1 = new Date(0);`5

`let d1 = new Date(0);`6

`let d1 = new Date(0);`7

`let d1 = new Date(0);`8

`let d1 = new Date(0);`9

`console.log(d1);`0

`console.log(d1);`1

`console.log(d1);`2

`console.log(d1);`3

`console.log(d1);`4

`console.log(d1);`5

`console.log(d1);`6

`console.log(d1);`7

Nếu bạn muốn xem toàn bộ mã nguồn được sử dụng trong bài viết này, đây là kho lưu trữ GitHub.

\>>> Xem thêm: Hiểu Rõ Về Các Loại Vòng Lặp Trong Javascript Và Cấu Trúc Từng Loại Vòng Lặp

5. Phát triển dự án bằng cách sử dụng khái niệm ngày của JavaScript

Bạn sẽ gặp nhiều trường hợp về ngày JavaScript khi làm việc trên các ứng dụng trong thế giới thực. Nếu bạn muốn bắt đầu với một dự án đơn giản và có được kinh nghiệm thực tế, bạn có thể phát triển đồng hồ kỹ thuật số bằng HTML, CSS và JavaScript. Cùng với ngày tháng, bạn cũng sẽ học một số khái niệm JavaScript quan trọng như làm việc với các biến, sử dụng các hàm, truy cập và thêm thuộc tính vào DOM, v.v.