Khi một toán tử được sử dụng với các toán hạng thuộc các loại khác nhau, việc chuyển đổi loại xảy ra để làm cho các toán hạng tương thích. Một số chuyển đổi xảy ra ngầm. Ví dụ: MySQL tự động chuyển đổi chuỗi thành số khi cần thiết và ngược lại
mysql>SELECT 1+'1';
-> 2 mysql>SELECT CONCAT[2,' test'];
-> '2 test'
Cũng có thể chuyển đổi một số thành một chuỗi rõ ràng bằng hàm. Chuyển đổi xảy ra hoàn toàn với hàm vì nó mong đợi các đối số chuỗi
mysql>SELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
Xem phần sau trong phần này để biết thông tin về bộ ký tự của chuyển đổi số thành chuỗi ẩn và để biết các quy tắc đã sửa đổi áp dụng cho câu lệnh
mysql>0SELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
Các quy tắc sau mô tả cách chuyển đổi xảy ra đối với các hoạt động so sánh
Nếu một hoặc cả hai đối số là
mysql>
1, thì kết quả so sánh làSELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'mysql>
1, ngoại trừ toán tử so sánh đẳng thức an toànSELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'mysql>
1. Đối vớiSELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'mysql>
5, kết quả là true. Không cần chuyển đổiSELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'Nếu cả hai đối số trong thao tác so sánh đều là chuỗi, thì chúng được so sánh dưới dạng chuỗi
Nếu cả hai đối số là số nguyên, chúng được so sánh là số nguyên
Giá trị thập lục phân được coi là chuỗi nhị phân nếu không được so sánh với một số
Nếu một trong các đối số là cột
mysql>
6 hoặcSELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'mysql>
7 và đối số kia là hằng số, thì hằng số đó được chuyển đổi thành dấu thời gian trước khi thực hiện so sánh. Điều này được thực hiện để thân thiện hơn với ODBC. Điều này không được thực hiện cho các đối số để. Để an toàn, hãy luôn sử dụng chuỗi ngày giờ, ngày tháng hoặc thời gian hoàn chỉnh khi thực hiện so sánh. Ví dụ: để đạt được kết quả tốt nhất khi sử dụng với các giá trị ngày hoặc giờ, hãy sử dụng để chuyển đổi rõ ràng các giá trị sang loại dữ liệu mong muốnSELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'Truy vấn con một hàng từ một bảng hoặc nhiều bảng không được coi là hằng số. Ví dụ: nếu một truy vấn con trả về một số nguyên để so sánh với một giá trị
mysql>
7, thì việc so sánh được thực hiện dưới dạng hai số nguyên. Số nguyên không được chuyển đổi thành giá trị tạm thời. Để so sánh các toán hạng dưới dạng giá trịSELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'mysql>
7, hãy sử dụng để chuyển đổi rõ ràng giá trị truy vấn con thànhSELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'mysql>
7SELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'Nếu một trong các đối số là giá trị thập phân, so sánh phụ thuộc vào đối số khác. Các đối số được so sánh dưới dạng giá trị thập phân nếu đối số khác là giá trị số thập phân hoặc số nguyên hoặc dưới dạng giá trị dấu phẩy động nếu đối số khác là giá trị dấu phẩy động
Trong tất cả các trường hợp khác, các đối số được so sánh dưới dạng số dấu phẩy động [độ chính xác kép]. Ví dụ: so sánh toán hạng chuỗi và số diễn ra như so sánh số dấu phẩy động
Để biết thông tin về việc chuyển đổi giá trị từ loại tạm thời này sang loại tạm thời khác, hãy xem Phần 11. 2. 8, “Chuyển đổi giữa các loại ngày và giờ”
Các ví dụ sau minh họa việc chuyển đổi chuỗi thành số cho các hoạt động so sánh
mysql>2SELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
Để so sánh cột chuỗi với số, MySQL không thể sử dụng chỉ mục trên cột để tra cứu giá trị nhanh chóng. Nếu
mysql>25 là một cột chuỗi được lập chỉ mục, chỉ mục không thể được sử dụng khi thực hiện tra cứu trong câu lệnh sauSELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
mysql>4SELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
Lý do cho điều này là có nhiều chuỗi khác nhau có thể chuyển đổi thành giá trị
mysql>26, chẳng hạn nhưSELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
mysql>27,SELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
mysql>28 hoặcSELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
mysql>29SELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
So sánh giữa các số dấu phẩy động và các giá trị lớn của loại
mysql>40 là gần đúng vì số nguyên được chuyển đổi thành dấu phẩy động có độ chính xác kép trước khi so sánh, không có khả năng biểu diễn chính xác tất cả các số nguyên 64 bit. Ví dụ: giá trị số nguyên 253 + 1 không thể biểu thị dưới dạng số float và được làm tròn thành 253 hoặc 253 + 2 trước khi so sánh số float, tùy thuộc vào nền tảngSELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
Để minh họa, chỉ phép so sánh đầu tiên sau đây so sánh các giá trị bằng nhau, nhưng cả hai phép so sánh đều trả về giá trị đúng [1]
mysql>0SELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
Khi chuyển đổi từ chuỗi sang dấu phẩy động và từ số nguyên sang dấu phẩy động xảy ra, chúng không nhất thiết xảy ra theo cùng một cách. Số nguyên có thể được chuyển đổi thành dấu phẩy động bởi CPU, trong khi chuỗi được chuyển đổi từng chữ số trong một phép toán liên quan đến phép nhân dấu phẩy động. Ngoài ra, kết quả có thể bị ảnh hưởng bởi các yếu tố như kiến trúc máy tính hoặc phiên bản trình biên dịch hoặc mức độ tối ưu hóa. Một cách để tránh những vấn đề như vậy là sử dụng để một giá trị không được chuyển đổi hoàn toàn thành một số dấu phẩy động
mysql>1SELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
Để biết thêm thông tin về phép so sánh dấu phẩy động, hãy xem Phần B. 3. 4. 8, “Các vấn đề với giá trị dấu phẩy động”
Máy chủ bao gồm
mysql>42, một thư viện chuyển đổi cung cấp cơ sở cho việc chuyển đổi được cải thiện giữa giá trị chuỗi hoặc giá trịSELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
mysql>43 và số giá trị gần đúng [SELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
mysql>44/SELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
mysql>45]SELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
Kết quả chuyển đổi nhất quán trên các nền tảng, giúp loại bỏ, ví dụ, sự khác biệt về chuyển đổi giữa Unix và Windows
Thể hiện chính xác các giá trị trong trường hợp các kết quả trước đó không cung cấp đủ độ chính xác, chẳng hạn như đối với các giá trị gần với giới hạn của IEEE
Chuyển đổi số sang định dạng chuỗi với độ chính xác tốt nhất có thể. Độ chính xác của
mysql>
42 luôn bằng hoặc tốt hơn độ chính xác của các hàm thư viện C tiêu chuẩnSELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
Do các chuyển đổi do thư viện này tạo ra trong một số trường hợp khác với các kết quả không phải ____142, nên có khả năng xảy ra sự không tương thích trong các ứng dụng dựa trên các kết quả trước đó. Ví dụ: các ứng dụng phụ thuộc vào kết quả chính xác cụ thể từ các chuyển đổi trước đó có thể cần điều chỉnh để phù hợp với độ chính xác bổ sung
Thư viện
mysql>42 cung cấp các chuyển đổi với các thuộc tính sau.SELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
mysql>49 đại diện cho một giá trị cóSELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
mysql>43 hoặc đại diện chuỗi vàSELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
mysql>01 đại diện cho số dấu phẩy động ở định dạng nhị phân gốc [IEEE]SELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
Chuyển đổi
mysql>
01 ->SELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'mysql>
49 được thực hiện với độ chính xác tốt nhất có thể, trả vềSELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'mysql>
49 là chuỗi ngắn nhất tạo raSELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'mysql>
01 khi đọc lại và làm tròn thành giá trị gần nhất ở định dạng nhị phân nguyên gốc như được chỉ định bởi IEEESELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'Chuyển đổi
mysql>
49 ->SELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'mysql>
01 được thực hiện sao choSELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'mysql>
01 là số nhị phân gốc gần nhất với chuỗi thập phân đầu vàoSELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'mysql>
49SELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
Các thuộc tính này ngụ ý rằng các chuyển đổi
mysql>01 ->SELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
mysql>49 ->SELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
mysql>01 là không mất dữ liệu trừ khiSELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
mysql>01 làSELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
mysql>14,SELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
mysql>15 hoặcSELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
mysql>16. Các giá trị sau không được hỗ trợ vì tiêu chuẩn SQL xác định chúng là các giá trị không hợp lệ choSELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
mysql>44 hoặcSELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
mysql>45SELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
Đối với chuyển đổi
mysql>49 ->SELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
mysql>01 ->SELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
mysql>49, điều kiện đủ để không mất dữ liệu làSELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
mysql>49 sử dụng độ chính xác từ 15 chữ số trở xuống, không phải là giá trị bất thường,SELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
mysql>14,SELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
mysql>15 hoặcSELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
mysql>16. Trong một số trường hợp, việc chuyển đổi không mất dữ liệu ngay cả khiSELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
mysql>49 có độ chính xác hơn 15 chữ số, nhưng điều này không phải lúc nào cũng đúngSELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
Chuyển đổi ngầm định một giá trị số hoặc thời gian thành chuỗi tạo ra một giá trị có bộ ký tự và đối chiếu được xác định bởi các biến hệ thống và. [Các biến này thường được đặt với
mysql>79. Để biết thông tin về bộ ký tự kết nối, hãy xem Phần 10. 4, “Bộ ký tự kết nối và đối chiếu”. ]SELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
Điều này có nghĩa là một chuyển đổi như vậy dẫn đến một chuỗi ký tự [không phải nhị phân] [giá trị
mysql>80,SELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
mysql>81 hoặcSELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
mysql>82], ngoại trừ trường hợp bộ ký tự kết nối được đặt thànhSELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
mysql>83. Trong trường hợp đó, kết quả chuyển đổi là một chuỗi nhị phân [giá trịSELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
mysql>84,SELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
mysql>85 hoặcSELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
mysql>86]SELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
Đối với các biểu thức số nguyên, các nhận xét trước về đánh giá biểu thức áp dụng hơi khác cho phép gán biểu thức;
mysql>7SELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
Trong trường hợp này, bảng trong cột kết quả từ biểu thức có kiểu
mysql>87 hoặcSELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
mysql>88 tùy thuộc vào độ dài của biểu thức số nguyên. Nếu độ dài tối đa của biểu thức không vừa với mộtSELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
mysql>87, thì thay vào đó, hãy sử dụngSELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
mysql>88. Độ dài được lấy từ giá trịSELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
mysql>21 của siêu dữ liệu tập kết quảSELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
mysql>22 [xem Cấu trúc dữ liệu cơ bản của API C]. Điều này có nghĩa là bạn có thể buộcSELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
mysql>88 thay vìSELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'
mysql>87 bằng cách sử dụng một biểu thức đủ dàiSELECT 38.8, CAST[38.8 AS CHAR];
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT[38.8];
-> 38.8, '38.8'