Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Giới thiệu về các kiểu dữ liệu MySQL


Giới thiệu

Một trong những tính năng chính của cơ sở dữ liệu quan hệ nói chung là khả năng xác định các lược đồ hoặc cấu trúc bảng chỉ định chính xác định dạng dữ liệu mà chúng sẽ chứa. Điều này được thực hiện bằng cách chỉ định các cột mà các cấu trúc này chứa cùng với kiểu dữ liệu của chúng và bất kỳ ràng buộc nào.

Các kiểu dữ liệu chỉ định một mẫu chung cho dữ liệu mà chúng chấp nhận và lưu trữ. Các giá trị phải tuân theo các yêu cầu mà chúng phác thảo để được MySQL chấp nhận. Mặc dù có thể xác định các yêu cầu tùy chỉnh, nhưng kiểu dữ liệu cung cấp các khối xây dựng cơ bản cho phép MySQL xác thực đầu vào và làm việc với dữ liệu bằng các thao tác thích hợp.

MySQL bao gồm một loạt các kiểu dữ liệu được sử dụng để gắn nhãn và xác nhận rằng các giá trị tuân theo các kiểu thích hợp. Trong hướng dẫn này, chúng ta sẽ thảo luận về các kiểu dữ liệu phổ biến nhất có sẵn trong MySQL, các định dạng đầu vào và đầu ra khác nhau mà chúng sử dụng và cách định cấu hình các trường khác nhau để đáp ứng nhu cầu ứng dụng của bạn.


Các kiểu dữ liệu trong MySQL là gì?

Trước khi đi vào chi tiết, chúng ta hãy cùng xem xét những kiểu dữ liệu mà MySQL cung cấp.

MySQL hỗ trợ một loạt các kiểu dữ liệu hợp lý phù hợp với nhiều loại dữ liệu đơn giản và phức tạp. Chúng bao gồm:

  • TINYINT
  • SMALLINT
  • MEDIUMINT
  • INT
  • BIGINT
  • DECIMAL
  • NUMERIC
  • FLOAT
  • DOUBLE
  • BIT
  • DATE
  • DATETIME
  • TIMESTAMP
  • TIME
  • YEAR
  • CHAR
  • VARCHAR
  • BINARY
  • VARBINARY
  • BLOB
  • TEXT
  • ENUM
  • SET
  • GEOMETRY
  • POINT
  • LINESTRING
  • POLYGON
  • MULTIPOINT
  • MULTILINESTRING
  • MULTIPOLYGON
  • GEOMETRYCOLLECTION
  • JSON

Chúng tôi sẽ đề cập sâu hơn những điểm chung nhất trong số này trong suốt hướng dẫn này.



Bắt đầu với kiểu dữ liệu MySQL

Khi bạn bắt đầu với các loại, điều quan trọng cần nhớ là một mình các loại không phải lúc nào cũng là một giải pháp hoàn chỉnh để xác thực dữ liệu mà là một thành phần. Các công cụ cơ sở dữ liệu khác, như các ràng buộc cũng có vai trò trong việc xác định tính đúng đắn. Tuy nhiên, các loại dữ liệu thường là tuyến phòng thủ đầu tiên chống lại dữ liệu không hợp lệ.

Đối với nhiều trường hợp, các kiểu chung do MySQL cung cấp phù hợp với các loại dữ liệu bạn sẽ lưu trữ. Ví dụ:trong khi bạn có thể lưu trữ tọa độ của một điểm hình học trong hai cột số khác nhau, thì point được cung cấp loại là mục đích được xây dựng để lưu trữ và xác thực chính xác loại thông tin này. Khi chọn loại, hãy kiểm tra xem bạn có đang sử dụng loại cụ thể nhất áp dụng cho trường hợp sử dụng của mình không.




Số và giá trị số

MySQL bao gồm một loạt các kiểu dữ liệu số phù hợp với các tình huống khác nhau. Loại thích hợp phụ thuộc vào bản chất chính xác của các giá trị bạn định lưu trữ cũng như yêu cầu về độ chính xác của bạn.


Số nguyên

Số nguyên kiểu dữ liệu là một loại kiểu dùng để lưu trữ số mà không có bất kỳ phân số hoặc số thập phân nào. Đây có thể là giá trị dương hoặc âm và các kiểu số nguyên khác nhau có thể lưu trữ các phạm vi số khác nhau. Loại số nguyên có phạm vi giá trị chấp nhận được nhỏ hơn chiếm ít không gian hơn loại có phạm vi rộng hơn.

Danh sách cơ bản của các kiểu số nguyên bao gồm:

Kiểu số nguyên Chiều dài Phạm vi đã ký áp dụng Phạm vi không dấu có thể áp dụng
TINYINT 1 byte -128 đến 127 0 đến 255
SMALLINT 2 byte -32768 đến 32767 0 đến 65535
MEDIUMINT 3 byte -8388608 đến 8388607 0 đến 16777215
INT 4 byte -2147483648 đến 2147483647 0 đến 4294967295
BIGINT 8 byte -2 ^ 63 đến -2 ^ 63-1 0 đến 2 ^ 64-1

Các loại trên bị giới hạn bởi phạm vi hợp lệ của chúng. Bất kỳ giá trị nào nằm ngoài phạm vi sẽ dẫn đến lỗi.

Ngoài các kiểu được đề cập ở trên, MySQL còn nhận ra một bí danh được gọi là SERIAL . Đánh dấu một cột là SERIAL sẽ cung cấp cho nó các thuộc tính sau:BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE . Điều này được sử dụng như một cách viết tắt cho các thuộc tính cột khóa chính phổ biến. Cột sẽ tự động gán một giá trị duy nhất mới bất cứ khi nào một bản ghi được thêm vào.



Điểm cố định

Các loại điểm cố định được sử dụng để kiểm soát lượng độ chính xác hoặc tính cụ thể có thể có đối với một số có số thập phân. Trong MySQL, điều này có thể được kiểm soát bằng cách sử dụng hai yếu tố:độ chính xác và tỷ lệ.

Độ chính xác là tổng số chữ số lớn nhất mà một số có thể có. Ngược lại, quy mô là số chữ số ở bên phải dấu thập phân. Bằng cách thao tác với những con số này, bạn có thể kiểm soát mức độ cho phép của các thành phần phân số và không phân số của một số.

Hai đối số này được sử dụng để kiểm soát độ chính xác tùy ý bằng cách sử dụng numeric hoặc decimal kiểu dữ liệu (hai kiểu này đồng nghĩa trong MySQL). numeric kiểu không có đến hai đối số.

Không có đối số, cột được định nghĩa là có độ chính xác là 10 và thang điểm là 0. Điều này có nghĩa là cột có thể chứa tối đa 10 chữ số, nhưng không có chữ số nào trong số này có thể nằm sau dấu thập phân:

NUMERIC

Khi một đối số duy nhất được cung cấp, nó được hiểu là độ chính xác của cột với tỷ lệ được đặt thành 0. Điều này cho phép bạn chỉ định số chữ số tối đa trong một số giống như số nguyên (không có thành phần thập phân hoặc thập phân). Ví dụ:nếu bạn cần một số nguyên gồm 5 chữ số, bạn có thể chỉ định:

NUMERIC(5)

Chỉ định độ chính xác theo sau là tỷ lệ khi định cấu hình cột bằng cả hai điều khiển. MySQL sẽ làm tròn thành phần thập phân của bất kỳ đầu vào nào thành số chữ số chính xác bằng cách sử dụng số tỷ lệ. MySQL sẽ sử dụng độ chính xác và tỷ lệ để xác định có bao nhiêu chữ số được phép ở phía bên trái của dấu thập phân. Nếu một mục nhập vượt quá số chữ số cho phép, MySQL sẽ tạo ra lỗi.

Ví dụ:chúng tôi có thể chỉ định một cột có tổng độ chính xác là 5 và tỷ lệ là 2:

NUMERIC(5, 2)

Cột này sẽ có hành vi sau:

Giá trị đầu vào Giá trị được làm tròn Được chấp nhận (phù hợp với độ chính xác)?
400.28080 400,28
8.332799 8.33
11799.799 11799,80 Không
11799 11799 Không
2802,27 2802,27 Không


Dấu chấm động

Số dấu phẩy động là một cách khác để thể hiện số thập phân, nhưng không có độ chính xác nhất quán, chính xác. Thay vào đó, các kiểu dấu phẩy động chỉ có khái niệm về độ chính xác tối đa thường liên quan đến kiến ​​trúc và nền tảng của phần cứng.

Ví dụ:để giới hạn cột dấu phẩy động ở độ chính xác 8 chữ số, bạn có thể sử dụng FLOAT type, lưu trữ kết quả bằng cách sử dụng 4 byte với độ chính xác từ 0 đến 23 chữ số:

FLOAT(8)

Tương tự, DOUBLE kiểu sử dụng 8 byte để lưu trữ dữ liệu và có thể sử dụng các phân vùng từ 24 đến 53 chữ số.

Do những lựa chọn thiết kế này, số dấu phẩy động có thể hoạt động với các số có số lượng lớn các số thập phân một cách hiệu quả, nhưng không phải lúc nào cũng chính xác. Sự thể hiện bên trong của các con số có thể gây ra sự khác biệt nhỏ giữa đầu vào và đầu ra. Điều này có thể gây ra hành vi không mong muốn khi so sánh các giá trị, thực hiện phép toán dấu phẩy động hoặc thực hiện các phép toán yêu cầu giá trị chính xác.



Dấu chấm động so với số

Cả hai số dấu phẩy động được cung cấp bởi các loại như FLOATDOUBLE và số điểm cố định do NUMERIC cung cấp hoặc DECIMAL loại có thể được sử dụng để lưu trữ các giá trị thập phân. Làm thế nào để bạn biết cái nào để sử dụng?

Nguyên tắc chung là nếu bạn cần tính chính xác trong tính toán của mình, thì NUMERIC loại luôn luôn là sự lựa chọn tốt hơn. NUMERIC loại sẽ lưu trữ các giá trị chính xác như chúng được cung cấp, có nghĩa là kết quả hoàn toàn có thể dự đoán được khi truy xuất hoặc tính toán các giá trị. NUMERIC kiểu được gọi là độ chính xác tùy ý vì bạn chỉ định độ chính xác mà kiểu yêu cầu và nó sẽ lưu trữ lượng chữ số chính xác đó trong trường.

Ngược lại, các loại như FLOATDOUBLE là các loại chính xác có thể thay đổi. Mức độ chính xác mà chúng duy trì phụ thuộc vào giá trị đầu vào. Khi đạt đến cuối mức độ chính xác cho phép, chúng có thể làm tròn các chữ số còn lại, dẫn đến sự khác biệt giữa các giá trị đã gửi và đã truy xuất.

Vì vậy, khi nào bạn sẽ sử dụng các loại độ chính xác thay đổi? Các loại chính xác có thể thay đổi như FLOATDOUBLE rất thích hợp cho các trường hợp không cần đến các giá trị chính xác (ví dụ:nếu chúng sẽ được làm tròn) và khi tốc độ có giá trị cao. Độ chính xác của biến thường sẽ mang lại lợi ích về hiệu suất trên NUMERIC loại.




Loại chuỗi

Các kiểu ký tự và kiểu chuỗi của MySQL có thể được đặt thành hai loại: độ dài cố định độ dài thay đổi . Sự lựa chọn giữa hai giá trị này ảnh hưởng đến cách MySQL phân bổ không gian cho mỗi giá trị và cách nó xác thực đầu vào.

Kiểu dữ liệu dựa trên ký tự đơn giản nhất trong MySQL là char gõ phím. Không có đối số, char kiểu chấp nhận một ký tự duy nhất làm đầu vào:

CHAR

Khi một số nguyên dương được cung cấp trong khai báo, char cột sẽ lưu trữ một chuỗi ký tự có độ dài cố định bằng số ký tự được chỉ định:

CHAR(10)

Nếu một chuỗi được cung cấp với ít ký tự hơn, các khoảng trống sẽ được thêm vào để tăng độ dài:

Đầu vào # ký tự đầu vào Giá trị được lưu trữ # ký tự được lưu trữ
'cây' 4 'cây' 10

Nếu một chuỗi được cung cấp với số lượng ký tự lớn hơn cho phép, MySQL sẽ phát sinh lỗi. Ngoại lệ đối với quy tắc này, nếu các ký tự tràn đều là khoảng trắng, MySQL sẽ đơn giản cắt bớt các khoảng trống thừa để vừa với trường.

Thay thế cho các trường ký tự có độ dài cố định là các trường có độ dài thay đổi. Đối với điều này, MySQL cung cấp varchar gõ phím. varchar kiểu lưu trữ các ký tự không có kích thước cố định. Không giống như char , varchar không thể được sử dụng mà không chỉ định số ký tự tối đa để lưu trữ.

Bằng cách xác định một varchar với một số nguyên dương, bạn có thể đặt độ dài chuỗi tối đa:

VARCHAR(10)

Điều này khác với việc sử dụng char nhập với một số nguyên trong varchar đó sẽ không đệm giá trị nếu đầu vào không đáp ứng độ dài trường tối đa:

Đầu vào # ký tự đầu vào Giá trị được lưu trữ # ký tự được lưu trữ
'cây' 4 'cây' 4

Nếu chuỗi lớn hơn độ dài tối đa, MySQL sẽ thông báo lỗi. Hành vi cắt ngắn tương tự có trong char các trường xảy ra ở đây:nếu các ký tự tràn là khoảng trắng, chúng sẽ bị cắt bớt để vừa với chiều dài ký tự tối đa.

MySQL cũng hỗ trợ binary varbinary Loại dữ liệu. Chúng hoạt động theo cách tương tự như charvarchar nhưng lưu trữ chuỗi nhị phân chứ không phải chuỗi ký tự. Điều này có ý nghĩa về cách chúng được lưu trữ và vận hành (đối với những thứ như so sánh, sắp xếp, v.v.).

Đối với binaryvarbinary loại, số nguyên được cung cấp khi xác định loại cột biểu thị số byte thay vì số ký tự.

Hai kiểu dữ liệu khác mà MySQL cung cấp cho chuỗi và lưu trữ ký tự là blob text . Các loại này hoạt động tương tự như varcharvarbinary loại tương ứng và được dùng để lưu trữ các đối tượng lớn. Chúng hoạt động chủ yếu giống như các đối tác của chúng, nhưng có một số khác biệt như không thể bắt đầu có giá trị mặc định và yêu cầu độ dài tiền tố khi tạo chỉ mục.



Booleans

MySQL thực sự không có kiểu boolean gốc để biểu thị các giá trị true và false.

MySQL nhận dạng các loại BOOL hoặc BOOLEAN trong nỗ lực tương thích với các hệ thống cơ sở dữ liệu khác. Tuy nhiên, việc triển khai nội bộ của nó sử dụng TINYINT(1) để lưu trữ các giá trị và diễn giải chúng là đúng hay sai dựa trên một bộ quy tắc.

Khi diễn giải các giá trị số trong ngữ cảnh boolean, giá trị của 0 được coi là sai. Tất cả các giá trị khác 0 đều được coi là đúng.

MySQL nhận dạng các ký tự boolean TRUEFALSE và chuyển đổi TRUE thành 1 và FALSE về 0 khi lưu trữ chúng.



Ngày và giờ

MySQL hỗ trợ đại diện cho ngày, giờ và sự kết hợp của cả hai.


Ngày

date loại có thể lưu trữ ngày mà không có giá trị thời gian liên quan:

DATE

Khi xử lý đầu vào cho date , MySQL có thể diễn giải các định dạng khác nhau để xác định ngày chính xác để lưu trữ. Tuy nhiên, các bộ phận thành phần phải luôn đi theo cùng một trình tự:năm, tháng và sau đó là ngày. STR_TO_DATE() có sẵn chức năng để giúp chuyển đổi các định dạng ngày tháng khác sang định dạng mà MySQL sẽ diễn giải chính xác.

Khi hiển thị ngày tháng, MySQL sử dụng YYYY-MM-DD định dạng. Bạn có thể sử dụng DATE_FORMAT() chức năng định dạng đầu ra ở các định dạng khác.

date loại có thể lưu trữ các giá trị khác nhau, từ 1000-01-01 thành 9999-12-31 .



Thời gian

time kiểu dữ liệu có thể lưu trữ một thời gian cụ thể trong ngày mà không có múi giờ hoặc ngày liên quan.

Khi xử lý đầu vào cho time , MySQL có thể diễn giải nhiều định dạng để xác định thời gian lưu trữ chính xác. Khi đầu vào có dấu hai chấm, nó thường được hiểu là hh:mm:ss . Mọi giá trị rút gọn (chỉ sử dụng một cột) sẽ được hiểu là sử dụng hh:mm . Khi đầu vào không không có dấu hai chấm, thời gian được xử lý để lấp đầy giá trị nhỏ nhất trước. Ví dụ:1045 được tính là 10 phút 45 giây.

MySQL cũng hỗ trợ giây phân số nếu dấu thập phân được đưa ra. Nó lưu trữ tới 6 chữ số chính xác sau số thập phân. Giá trị theo time các cột có thể nằm trong khoảng từ -838:59:59.000000 thành 838:59:59.000000 .

Khi hiển thị các giá trị thời gian, MySQL sử dụng hh:mm:ss định dạng. Cũng như ngày tháng, một hàm được cung cấp, được gọi là TIME_FORMAT() để hiển thị các giá trị thời gian bằng các định dạng khác.




Dấu thời gian và ngày giờ

MySQL có thể đại diện cho dấu thời gian, sự kết hợp của ngày và giờ được sử dụng để biểu thị một thời điểm cụ thể trong thời gian, theo hai biến thể khác nhau:sử dụng timestamp nhập và datetime loại.

datetime loại có thể đại diện cho các giá trị từ 1000-01-01 00:00:00 tới 9999-12-31 23:59:59 . Nó cũng có thể bao gồm số giây phân số lên đến sáu chữ số tương tự như time loại.

Dấu thời gian timestamp kiểu có thể đại diện cho các giá trị từ 1970-01-01 00:00:01 UTC đến 2038-01-19 03:14:07 UTC. Nó cũng có thể xử lý phân số giây. Khi lưu trữ timestamp giá trị, tất cả các giá trị được chuyển đổi từ múi giờ đã cho sang UTC để lưu trữ và được chuyển đổi trở lại múi giờ địa phương khi truy xuất. datetime loại không làm được điều này.

Từ MySQL 8.0.19 trở đi, bạn có thể bao gồm độ lệch múi giờ khi lưu trữ timestamp để đặt múi giờ một cách rõ ràng cho giá trị được lưu trữ. Bạn làm điều này bằng cách bao gồm một giá trị sau thành phần thời gian, không có khoảng trống để chỉ ra độ lệch. Phạm vi giá trị được chấp nhận nằm trong khoảng từ -14:00 thành +14:00 , đại diện cho phần bù của giá trị được lưu trữ từ UTC.

Khi quyết định có nên lưu trữ các giá trị ngày và giờ bằng cách sử dụng datetime hay không hoặc timezone , thường sẽ hữu ích nếu phân tách chúng theo những gì chúng phù hợp nhất.

Hãy nghĩ về datetime các giá trị như một ngày và giờ cụ thể, trong mối quan hệ với lịch và đồng hồ ở bất cứ nơi nào nó được truy xuất. Nếu một người đi ngủ lúc 11 giờ đêm, thì datetime giá trị có thể đại diện cho giá trị đó, bất kể người đó hiện đang ở múi giờ nào.

Mặt khác, timezone giá trị tốt nhất trong việc thể hiện một thời điểm cụ thể trong thời gian rõ ràng qua các múi giờ. Để gửi lời mời gọi điện video, hãy đặt timezone giá trị sẽ có thể đảm bảo cuộc họp diễn ra cùng lúc cho mọi người, bất kể người tham gia đang ở múi giờ nào.



Các loại hữu ích khác

Cùng với các loại mà chúng tôi đã đề cập ở trên, còn có các loại bổ sung hữu ích trong các tình huống cụ thể. Chúng tôi sẽ trình bày ngắn gọn những điều này để cung cấp cho bạn ý tưởng về cách sử dụng chúng và khi nào chúng có thể hữu ích.


Loại được liệt kê và đặt

Hai loại có liên quan cho phép người dùng chỉ định các giá trị hợp lệ cho một cột là enum set các loại.

enum type là kiểu chuỗi cho phép người dùng xác định tập hợp các giá trị hợp lệ khi cột được tạo. Bất kỳ giá trị nào khớp với một trong các giá trị đã xác định đều được chấp nhận và tất cả các giá trị khác bị từ chối. Chức năng này tương tự như một menu thả xuống trong đó có thể đưa ra lựa chọn từ một tập hợp các tùy chọn cụ thể. Ví dụ:một enum được gọi là season có thể được tạo bằng các giá trị winter , spring , summerautumn .

Để tạo một enum , chỉ định loại là enum , cung cấp các giá trị có thể có dưới dạng chuỗi, được phân tách bằng dấu phẩy, bên trong một tập hợp các dấu ngoặc đơn, như sau:

season ENUM('winter', 'spring', 'summer', 'autumn')

Một loại tương tự của loại do người dùng xác định là set gõ phím. Giống như enum loại, set loại cho phép người dùng chỉ định các giá trị hợp lệ dưới dạng chuỗi theo định nghĩa. Sự khác biệt giữa hai loại này là trong một set , nhiều hơn một giá trị có thể được lưu trữ cho mỗi bản ghi.

Ví dụ:nếu bạn cần một cột đại diện cho các ngày trong tuần tình nguyện viên sẵn sàng làm việc, bạn có thể có set cột như thế này:

availability SET('sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday')

Khi nhập các giá trị cho availability cột chúng tôi vừa tạo, bạn cung cấp một chuỗi đơn với dấu phẩy phân tách tất cả những ngày tình nguyện viên có mặt. Ví dụ:

'monday,tuesday,wednesday,thursday,friday''sunday,saturday''monday,wednesday,friday''thursday'

Đối với set trong MySQL, các giá trị trùng lặp trong đầu vào luôn bị loại bỏ và khi truy xuất, các giá trị tuân theo thứ tự được sử dụng trong set định nghĩa bất kể thứ tự khi nhập vào cột.



JSON

MySQL hỗ trợ các cột trong JSON bằng cách sử dụng json gõ phím. Dữ liệu được lưu trữ dưới dạng json được lưu trữ dưới dạng nhị phân để thực thi và xử lý nhanh hơn để máy chủ không phải diễn giải một chuỗi để hoạt động trên JSON giá trị.

JSON

Để hoạt động trên JSON , MySQL cung cấp một số hàm để làm việc với các giá trị trong tài liệu.




Kết luận

Trong bài viết này, chúng tôi đã đề cập đến rất nhiều kiểu dữ liệu phổ biến nhất hữu ích khi làm việc với cơ sở dữ liệu MySQL. Có những loại bổ sung không được đề cập trong hướng dẫn này hữu ích để biết về nó, nhưng chúng thể hiện một điểm khởi đầu tốt cho hầu hết các trường hợp sử dụng.

Điều quan trọng là sử dụng hệ thống kiểu một cách thích hợp để bạn có thể kiểm soát các giá trị hợp lệ và hoạt động trên dữ liệu như mong đợi. Có những cạm bẫy bạn có thể gặp phải nếu bạn chọn một kiểu không phù hợp với dữ liệu của mình, vì vậy suy nghĩ trước khi bạn cam kết với một kiểu dữ liệu là điều đáng giá trong hầu hết các trường hợp.

Nếu bạn đang sử dụng Prisma Client để làm việc với cơ sở dữ liệu MySQL của mình, bạn có thể tìm thấy ánh xạ giữa một số loại MySQL và Prisma phổ biến trong tài liệu về trình kết nối dữ liệu MySQL của Prisma.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Có phải đóng các kết nối SQL được mở bằng PDO trong PHP không

  2. Chọn truy vấn mysql giữa ngày?

  3. Tạo người dùng MySQL trên Linux qua Dòng lệnh

  4. JSON_ARRAY_APPEND () - Nối Giá trị vào Mảng JSON trong MySQL

  5. Hàm MySQL LOG2 () - Trả về Logarit cơ số 2 của một giá trị