Trường blob truy vấn mysql

Hầu hết các công cụ cơ sở dữ liệu SQL [mọi công cụ cơ sở dữ liệu SQL khác với SQLite, theo như chúng tôi biết] đều sử dụng kiểu gõ tĩnh, cứng nhắc. Với kiểu nhập tĩnh, kiểu dữ liệu của một giá trị được xác định bởi vùng chứa của nó - cột cụ thể trong đó giá trị được lưu trữ

SQLite sử dụng một hệ thống kiểu động tổng quát hơn. Trong SQLite, kiểu dữ liệu của một giá trị được liên kết với chính giá trị đó, không phải với vùng chứa của nó. Hệ thống kiểu động của SQLite tương thích ngược với các hệ thống kiểu tĩnh phổ biến hơn của các công cụ cơ sở dữ liệu khác theo nghĩa là các câu lệnh SQL hoạt động trên cơ sở dữ liệu kiểu tĩnh hoạt động theo cùng một cách trong SQLite. Tuy nhiên, kiểu gõ động trong SQLite cho phép nó thực hiện những việc không thể thực hiện được trong cơ sở dữ liệu kiểu cứng nhắc truyền thống. Gõ linh hoạt là một tính năng của SQLite, không phải lỗi

Cập nhật. Kể từ phiên bản 3. 37. 0 [27-11-2021], SQLite cung cấp các bảng STRICT thực thi kiểu cứng nhắc, dành cho các nhà phát triển thích kiểu đó

Mỗi giá trị được lưu trữ trong cơ sở dữ liệu SQLite [hoặc được thao tác bởi công cụ cơ sở dữ liệu] có một trong các lớp lưu trữ sau

  • VÔ GIÁ TRỊ. Giá trị là giá trị NULL

  • số nguyên. Giá trị là một số nguyên có dấu, được lưu trữ trong 0, 1, 2, 3, 4, 6 hoặc 8 byte tùy thuộc vào độ lớn của giá trị

  • CÓ THẬT. Giá trị là một giá trị dấu phẩy động, được lưu trữ dưới dạng số dấu phẩy động IEEE 8 byte

  • CHỮ. Giá trị là một chuỗi văn bản, được lưu trữ bằng mã hóa cơ sở dữ liệu [UTF-8, UTF-16BE hoặc UTF-16LE]

  • BÃI. Giá trị là một đốm dữ liệu, được lưu trữ chính xác như khi nhập

Một lớp lưu trữ tổng quát hơn một kiểu dữ liệu. Ví dụ, lớp lưu trữ INTEGER bao gồm 7 kiểu dữ liệu số nguyên khác nhau với độ dài khác nhau. Điều này tạo ra sự khác biệt trên đĩa. Nhưng ngay sau khi các giá trị INTEGER được đọc khỏi đĩa và vào bộ nhớ để xử lý, chúng sẽ được chuyển đổi thành kiểu dữ liệu chung nhất [số nguyên có dấu 8 byte]. Và do đó, phần lớn, "lớp lưu trữ" không thể phân biệt được với "kiểu dữ liệu" và hai thuật ngữ này có thể được sử dụng thay thế cho nhau

Bất kỳ cột nào trong cơ sở dữ liệu SQLite phiên bản 3, ngoại trừ cột INTEGER PRIMARY KEY, đều có thể được sử dụng để lưu trữ giá trị của bất kỳ lớp lưu trữ nào

Tất cả các giá trị trong các câu lệnh SQL, cho dù chúng là các ký tự được nhúng trong văn bản câu lệnh SQL hay các tham số được liên kết với các câu lệnh SQL được biên dịch trước đều có một lớp lưu trữ ngầm định. Trong các trường hợp được mô tả bên dưới, công cụ cơ sở dữ liệu có thể chuyển đổi các giá trị giữa các lớp lưu trữ số [INTEGER và REAL] và TEXT trong khi thực hiện truy vấn

2. 1. Kiểu dữ liệu Boolean

SQLite không có lớp lưu trữ Boolean riêng. Thay vào đó, các giá trị Boolean được lưu trữ dưới dạng số nguyên 0 [sai] và 1 [đúng]

SQLite nhận ra các từ khóa "TRUE" và "FALSE", kể từ phiên bản 3. 23. 0 [2018-04-02] nhưng những từ khóa đó thực sự chỉ là cách viết thay thế cho các số nguyên lần lượt là 1 và 0

2. 2. Kiểu dữ liệu ngày và giờ

SQLite không có lớp lưu trữ dành riêng để lưu trữ ngày và/hoặc thời gian. Thay vào đó, các Hàm Ngày và Giờ tích hợp của SQLite có khả năng lưu trữ ngày và giờ dưới dạng các giá trị VĂN BẢN, THỰC hoặc SỐ

  • TEXT dưới dạng chuỗi ISO8601 ["YYYY-MM-DD HH. MM. SS. SSS"]
  • REAL như số ngày Julian, số ngày kể từ trưa ở Greenwich ngày 24 tháng 11 năm 4714 B. C. theo lịch Gregorian proleptic
  • INTEGER dưới dạng Unix Time, số giây kể từ 1970-01-01 00. 00. 00 UTC

Các ứng dụng có thể chọn lưu trữ ngày và giờ ở bất kỳ định dạng nào trong số này và tự do chuyển đổi giữa các định dạng bằng cách sử dụng chức năng ngày và giờ tích hợp

Các công cụ cơ sở dữ liệu SQL sử dụng kiểu gõ cứng nhắc thường sẽ cố gắng tự động chuyển đổi các giá trị thành kiểu dữ liệu thích hợp. Xem xét điều này

CREATE TABLE t1[a INT, b VARCHAR[10]];
INSERT INTO t1[a,b] VALUES['123',456];

Cơ sở dữ liệu được gõ cứng nhắc sẽ chuyển đổi chuỗi '123' thành số nguyên 123 và số nguyên 456 thành chuỗi '456' trước khi thực hiện thao tác chèn

Để tối đa hóa khả năng tương thích giữa SQLite và các công cụ cơ sở dữ liệu khác, đồng thời để ví dụ trên sẽ hoạt động trên SQLite giống như trên các công cụ cơ sở dữ liệu SQL khác, SQLite hỗ trợ khái niệm "mối quan hệ kiểu" trên các cột. Mối quan hệ loại của một cột là loại được khuyến nghị cho dữ liệu được lưu trữ trong cột đó. Ý tưởng quan trọng ở đây là loại được khuyến nghị, không bắt buộc. Bất kỳ cột nào vẫn có thể lưu trữ bất kỳ loại dữ liệu nào. Chỉ là một số cột, được lựa chọn, sẽ thích sử dụng một lớp lưu trữ hơn một lớp lưu trữ khác. Lớp lưu trữ ưa thích cho một cột được gọi là "mối quan hệ" của nó

Mỗi cột trong cơ sở dữ liệu SQLite 3 được gán một trong các kiểu tương đồng sau

  • CHỮ
  • SỐ
  • số nguyên
  • CÓ THẬT
  • BÃI

[Ghi chú lịch sử. Mối quan hệ loại "BLOB" từng được gọi là "KHÔNG". Nhưng thuật ngữ đó rất dễ nhầm lẫn với "không có mối quan hệ" và vì vậy nó đã được đổi tên thành. ]

Một cột có mối quan hệ TEXT lưu trữ tất cả dữ liệu bằng cách sử dụng các lớp lưu trữ NULL, TEXT hoặc BLOB. Nếu dữ liệu số được chèn vào một cột có mối quan hệ TEXT, nó sẽ được chuyển đổi thành dạng văn bản trước khi được lưu trữ

Một cột có ái lực NUMERIC có thể chứa các giá trị sử dụng tất cả năm lớp lưu trữ. Khi dữ liệu văn bản được chèn vào cột NUMERIC, lớp lưu trữ của văn bản được chuyển đổi thành INTEGER hoặc REAL [theo thứ tự ưu tiên] nếu văn bản tương ứng là số nguyên hoặc số thực được định dạng tốt. Nếu giá trị TEXT là một số nguyên được định dạng tốt, quá lớn để vừa với số nguyên có dấu 64 bit, thì nó sẽ được chuyển đổi thành REAL. Đối với các chuyển đổi giữa các lớp lưu trữ VĂN BẢN và THỰC, chỉ 15 chữ số thập phân có nghĩa đầu tiên của số được giữ lại. Nếu giá trị TEXT không phải là số nguyên hoặc ký tự thực được định dạng tốt, thì giá trị đó được lưu dưới dạng TEXT. Đối với mục đích của đoạn này, các chữ số nguyên thập lục phân không được coi là định dạng tốt và được lưu trữ dưới dạng TEXT. [Điều này được thực hiện để tương thích lịch sử với các phiên bản SQLite trước phiên bản 3. 8. 6 2014-08-15 nơi các số nguyên thập lục phân lần đầu tiên được đưa vào SQLite. ] Nếu một giá trị dấu phẩy động có thể được biểu diễn chính xác dưới dạng số nguyên được chèn vào một cột có ái lực SỐ, thì giá trị đó được chuyển đổi thành số nguyên. Không có nỗ lực nào được thực hiện để chuyển đổi các giá trị NULL hoặc BLOB

Một chuỗi có thể trông giống như một ký tự dấu chấm động với dấu thập phân và/hoặc ký hiệu số mũ nhưng miễn là giá trị có thể được biểu thị dưới dạng số nguyên, mối quan hệ NUMERIC sẽ chuyển đổi nó thành số nguyên. Do đó, chuỗi '3. 0e+5' được lưu trữ trong một cột có ái lực NUMERIC là số nguyên 300000, không phải là giá trị dấu phẩy động 300000. 0

Cột sử dụng mối quan hệ INTEGER hoạt động giống như cột có mối quan hệ SỐ. Sự khác biệt giữa mối quan hệ INTEGER và NUMERIC chỉ rõ ràng trong biểu thức CAST. Biểu thức "CAST[4. 0 AS INT]" trả về một số nguyên 4, trong khi "CAST[4. 0 AS NUMERIC]" để lại giá trị dưới dạng dấu phẩy động 4. 0

Một cột có ái lực REAL hoạt động giống như một cột có ái lực NUMERIC ngoại trừ việc nó buộc các giá trị nguyên thành biểu diễn dấu phẩy động. [Là một tối ưu hóa nội bộ, các giá trị dấu phẩy động nhỏ không có thành phần phân số và được lưu trữ trong các cột có ái lực THỰC được ghi vào đĩa dưới dạng số nguyên để chiếm ít dung lượng hơn và được tự động chuyển đổi trở lại thành dấu phẩy động khi giá trị được đọc ra. Sự tối ưu hóa này hoàn toàn vô hình ở cấp độ SQL và chỉ có thể được phát hiện bằng cách kiểm tra các bit thô của tệp cơ sở dữ liệu. ]

Một cột có mối quan hệ BLOB không ưu tiên lớp lưu trữ này hơn lớp lưu trữ khác và không có nỗ lực nào được thực hiện để ép buộc dữ liệu từ lớp lưu trữ này sang lớp lưu trữ khác

3. 1. Xác định ái lực của cột

Đối với các bảng không được khai báo là STRICT, mối quan hệ của một cột được xác định bởi loại cột đã khai báo, theo các quy tắc sau theo thứ tự được hiển thị

  1. Nếu kiểu được khai báo chứa chuỗi "INT" thì nó được gán mối quan hệ INTEGER

  2. Nếu loại khai báo của cột chứa bất kỳ chuỗi nào trong số các chuỗi "CHAR", "CLOB" hoặc "TEXT" thì cột đó có mối quan hệ với TEXT. Lưu ý rằng loại VARCHAR chứa chuỗi "CHAR" và do đó được gán mối quan hệ TEXT

  3. Nếu loại được khai báo cho một cột chứa chuỗi "BLOB" hoặc nếu không có loại nào được chỉ định thì cột đó có mối quan hệ BLOB

  4. Nếu loại được khai báo cho một cột chứa bất kỳ chuỗi nào "REAL", "FLOA" hoặc "DOUB" thì cột đó có mối quan hệ THỰC

  5. Mặt khác, mối quan hệ là NUMERIC

Lưu ý rằng thứ tự của các quy tắc để xác định ái lực cột là quan trọng. Một cột có loại được khai báo là "CHARINT" sẽ khớp với cả quy tắc 1 và 2 nhưng quy tắc đầu tiên được ưu tiên và do đó mối quan hệ của cột sẽ là INTEGER

3. 1. 1. Ví dụ về tên sở thích

Bảng sau đây cho biết có bao nhiêu tên kiểu dữ liệu phổ biến từ các triển khai SQL truyền thống hơn được chuyển đổi thành các mối quan hệ theo năm quy tắc của phần trước. Bảng này chỉ hiển thị một tập con nhỏ các tên kiểu dữ liệu mà SQLite sẽ chấp nhận. Lưu ý rằng các đối số số trong ngoặc đơn theo sau tên loại [ví dụ:. "VARCHAR[255]"] bị SQLite bỏ qua - SQLite không áp đặt bất kỳ giới hạn độ dài nào [ngoài giới hạn SQLITE_MAX_LENGTH toàn cầu lớn] về độ dài của chuỗi, BLOB hoặc giá trị số

Tên kiểu chữ mẫu từ
Câu lệnh CREATE TABLE
hoặc biểu thức CASTResulting AffinityRule được sử dụng để xác định AffinityINT
INTEGER

Chủ Đề