Hướng dẫn type conversion mysql - loại chuyển đổi mysql

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 sẽ 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 các chuỗi thành các 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 một cách rõ ràng bằng cách sử dụng hàm CAST(). Chuyển đổi xảy ra ngầm với hàm CONCAT() 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 sau trong phần này để biết thông tin về bộ ký tự của các chuyển đổi số sang chuỗi ẩn và đối với các quy tắc được sửa đổi áp dụng cho các câu lệnh

mysql> SELECT 38.8, CAST(38.8 AS CHAR);
        -> 38.8, '38.8'
mysql> SELECT 38.8, CONCAT(38.8);
        -> 38.8, '38.8'
0.

Các quy tắc sau đây mô tả cách chuyển đổi xảy ra cho các hoạt động so sánh:

  • Nếu một hoặc cả hai đối số là

    mysql> SELECT 38.8, CAST(38.8 AS CHAR);
            -> 38.8, '38.8'
    mysql> SELECT 38.8, CONCAT(38.8);
            -> 38.8, '38.8'
    1, kết quả của so sánh là
    mysql> SELECT 38.8, CAST(38.8 AS CHAR);
            -> 38.8, '38.8'
    mysql> SELECT 38.8, CONCAT(38.8);
            -> 38.8, '38.8'
    1, ngoại trừ toán tử so sánh bình đẳng ____ 11-safe
    mysql> SELECT 38.8, CAST(38.8 AS CHAR);
            -> 38.8, '38.8'
    mysql> SELECT 38.8, CONCAT(38.8);
            -> 38.8, '38.8'
    4. Đối vớ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'
    5, kết quả là đúng. Không cần chuyển đổi.

  • Nếu cả hai đối số trong một hoạt động so sánh là các chuỗi, chúng được so sánh là chuỗi.

  • Nếu cả hai đối số là số nguyên, chúng được so sánh là số nguyên.

  • Các giá trị thập lục phân được coi là chuỗi nhị phân nếu không so sánh với một số.

  • Nếu một trong các đối số là cột

    mysql> SELECT 38.8, CAST(38.8 AS CHAR);
            -> 38.8, '38.8'
    mysql> SELECT 38.8, CONCAT(38.8);
            -> 38.8, '38.8'
    6 hoặc
    mysql> SELECT 38.8, CAST(38.8 AS CHAR);
            -> 38.8, '38.8'
    mysql> SELECT 38.8, CONCAT(38.8);
            -> 38.8, '38.8'
    7 và đối số khác là một hằng số, hằng số được chuyển đổi thành dấu thời gian trước khi so sánh được thực hiện. Điều này được thực hiện để thân thiện với ODBC hơn. Điều này không được thực hiện cho các đối số đến
    mysql> SELECT 38.8, CAST(38.8 AS CHAR);
            -> 38.8, '38.8'
    mysql> SELECT 38.8, CONCAT(38.8);
            -> 38.8, '38.8'
    8. Để an toàn, luôn luôn sử dụng chuỗi DateTime, ngày 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
    mysql> SELECT 38.8, CAST(38.8 AS CHAR);
            -> 38.8, '38.8'
    mysql> SELECT 38.8, CONCAT(38.8);
            -> 38.8, '38.8'
    9 với các giá trị ngày hoặc thời gian, hãy sử dụng CAST() để chuyển đổi rõ ràng các giá trị thành kiểu dữ liệu mong muốn.

    Một trình duyệt con hàng đơn từ bảng hoặc bảng không được coi là hằng số. Ví dụ: nếu một trình điều khiển con trả về một số nguyên được so sánh với giá trị

    mysql> SELECT 38.8, CAST(38.8 AS CHAR);
            -> 38.8, '38.8'
    mysql> SELECT 38.8, CONCAT(38.8);
            -> 38.8, '38.8'
    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ị thời gian. Để so sánh các toán hạng là các giá trị
    mysql> SELECT 38.8, CAST(38.8 AS CHAR);
            -> 38.8, '38.8'
    mysql> SELECT 38.8, CONCAT(38.8);
            -> 38.8, '38.8'
    7, hãy sử dụng CAST() để chuyển đổi rõ ràng giá trị truy vấn con thành
    mysql> SELECT 38.8, CAST(38.8 AS CHAR);
            -> 38.8, '38.8'
    mysql> SELECT 38.8, CONCAT(38.8);
            -> 38.8, '38.8'
    7.

  • Nếu một trong các đối số là một 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 là các giá trị thập phân nếu đối số khác là giá trị thập phân hoặc nguyên hoặc là giá trị điểm nổi nếu đối số khác là giá trị điểm nổi.

  • Trong tất cả các trường hợp khác, các đối số được so sánh là số điểm nổi (độ chính xác kép). Ví dụ, việc so sánh các toán hạng chuỗi và số diễn ra như là một so sánh các số điểm nổi.

Để biết thông tin về chuyển đổi các giá trị từ loại thời gian này sang loại thời gian khác, hãy xem Phần & NBSP; 11.2.7, Chuyển đổi giữa các loại ngày và thời gian.

So sánh các giá trị JSON diễn ra ở hai cấp độ. Mức so sánh đầu tiên dựa trên các loại JSON của các giá trị so sánh. Nếu các loại khác nhau, kết quả so sánh được xác định chỉ bằng loại có ưu tiên cao hơn. Nếu hai giá trị có cùng loại JSON, mức so sánh thứ hai xảy ra bằng cách sử dụng các quy tắc cụ thể loại. Để so sánh các giá trị JSON và không phải là JSON, giá trị không phải là JSON được chuyển đổi thành JSON và các giá trị được so sánh dưới dạng giá trị JSON. Để biết chi tiết, xem so sánh và đặt hàng của các giá trị JSON.

Các ví dụ sau đây minh họa việc chuyển đổi các chuỗi thành các số cho các hoạt động so sánh:

mysql> SELECT 1 > '6x';
        -> 0
mysql> SELECT 7 > '6x';
        -> 1
mysql> SELECT 0 > 'x6';
        -> 0
mysql> SELECT 0 = 'x6';
        -> 1

Để so sánh cột chuỗi với một số, MySQL không thể sử dụng chỉ mục trên cột để tra cứu giá trị một cách nhanh chóng. Nếu

mysql> SELECT 1 > '6x';
        -> 0
mysql> SELECT 7 > '6x';
        -> 1
mysql> SELECT 0 > 'x6';
        -> 0
mysql> SELECT 0 = 'x6';
        -> 1
5 là 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 sau:

SELECT * FROM tbl_name WHERE str_col=1;

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> SELECT 1 > '6x';
        -> 0
mysql> SELECT 7 > '6x';
        -> 1
mysql> SELECT 0 > 'x6';
        -> 0
mysql> SELECT 0 = 'x6';
        -> 1
6, chẳng hạn như
mysql> SELECT 1 > '6x';
        -> 0
mysql> SELECT 7 > '6x';
        -> 1
mysql> SELECT 0 > 'x6';
        -> 0
mysql> SELECT 0 = 'x6';
        -> 1
7,
mysql> SELECT 1 > '6x';
        -> 0
mysql> SELECT 7 > '6x';
        -> 1
mysql> SELECT 0 > 'x6';
        -> 0
mysql> SELECT 0 = 'x6';
        -> 1
8 hoặc
mysql> SELECT 1 > '6x';
        -> 0
mysql> SELECT 7 > '6x';
        -> 1
mysql> SELECT 0 > 'x6';
        -> 0
mysql> SELECT 0 = 'x6';
        -> 1
9.

So sánh giữa các số điểm nổi và các giá trị lớn của loại

SELECT * FROM tbl_name WHERE str_col=1;
0 là gần đúng vì số nguyên được chuyển đổi thành điểm nổi 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ể được thể hiện dưới dạng phao và được làm tròn đến 253 hoặc 253 + 2 trước khi so sánh phao, tùy thuộc vào nền tảng.

Để minh họa, chỉ có các so sánh đầu tiên so sánh các giá trị bằng nhau, nhưng cả hai so sánh đều trả về đúng (1):

mysql> SELECT '9223372036854775807' = 9223372036854775807;
        -> 1
mysql> SELECT '9223372036854775807' = 9223372036854775806;
        -> 1

Khi chuyển đổi từ chuỗi sang điểm nổi và từ số nguyên sang điểm nổi xảy ra, chúng không nhất thiết phải xảy ra theo cùng một cách. Số nguyên có thể được chuyển đổi thành điểm nổi bởi CPU, trong khi chuỗi được chuyển đổi chữ số theo chữ số trong một hoạt động liên quan đến phép nhân điểm nổi. 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 cấp độ tối ưu hóa. Một cách để tránh các vấn đề như vậy là sử dụng CAST() để giá trị không được chuyển đổi ngầm thành số điểm nổi:

mysql> SELECT CAST('9223372036854775807' AS UNSIGNED) = 9223372036854775806;
        -> 0

Để biết thêm thông tin về so sánh điểm nổi, xem Phần & NBSP; B.3.4.8, Các vấn đề với các giá trị dấu phẩy động.

Máy chủ bao gồm

SELECT * FROM tbl_name WHERE str_col=1;
2, thư viện chuyển đổi cung cấp cơ sở để cải thiện chuyển đổi giữa các giá trị chuỗi hoặc
SELECT * FROM tbl_name WHERE str_col=1;
3 và các số xấp xỉ-giá trị (____ 34/________ 35):

  • Kết quả chuyển đổi nhất quán trên các nền tảng, ví dụ, loại bỏ sự khác biệt của UNIX so với Windows.

  • Biểu diễn chính xác các giá trị trong trường hợp kết quả trước đây 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

    SELECT * FROM tbl_name WHERE str_col=1;
    2 luôn giống hoặc tốt hơn so với các hàm thư viện C tiêu chuẩn.

Bởi vì các chuyển đổi được tạo ra bởi thư viện này khác nhau trong một số trường hợp từ kết quả không phải là không, nên tiềm năng tồn tại đối với sự không tương thích trong các ứng dụng dựa trên 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

SELECT * FROM tbl_name WHERE str_col=1;
2 cung cấp các chuyển đổi với các thuộc tính sau.
SELECT * FROM tbl_name WHERE str_col=1;
9 đại diện cho một giá trị với biểu diễn
SELECT * FROM tbl_name WHERE str_col=1;
3 hoặc chuỗi và
mysql> SELECT '9223372036854775807' = 9223372036854775807;
        -> 1
mysql> SELECT '9223372036854775807' = 9223372036854775806;
        -> 1
1 đại diện cho một số điểm nổi ở định dạng nhị phân gốc (IEEE).

  • mysql> SELECT '9223372036854775807' = 9223372036854775807;
            -> 1
    mysql> SELECT '9223372036854775807' = 9223372036854775806;
            -> 1
    1 ->
    SELECT * FROM tbl_name WHERE str_col=1;
    9 Chuyển đổi được thực hiện với độ chính xác tốt nhất có thể, trả về
    SELECT * FROM tbl_name WHERE str_col=1;
    9 dưới dạng chuỗi ngắn nhất mang lại
    mysql> SELECT '9223372036854775807' = 9223372036854775807;
            -> 1
    mysql> SELECT '9223372036854775807' = 9223372036854775806;
            -> 1
    1 khi đọc lại và làm tròn đến giá trị gần nhất ở định dạng nhị phân gốc theo quy định của IEEE.

  • SELECT * FROM tbl_name WHERE str_col=1;
    9 ->
    mysql> SELECT '9223372036854775807' = 9223372036854775807;
            -> 1
    mysql> SELECT '9223372036854775807' = 9223372036854775806;
            -> 1
    1 Chuyển đổi được thực hiện sao cho
    mysql> SELECT '9223372036854775807' = 9223372036854775807;
            -> 1
    mysql> SELECT '9223372036854775807' = 9223372036854775806;
            -> 1
    1 là số nhị phân gốc gần nhất với chuỗi thập phân đầu vào
    SELECT * FROM tbl_name WHERE str_col=1;
    9.

Các thuộc tính này ngụ ý rằng

mysql> SELECT '9223372036854775807' = 9223372036854775807;
        -> 1
mysql> SELECT '9223372036854775807' = 9223372036854775806;
        -> 1
1 ->
SELECT * FROM tbl_name WHERE str_col=1;
9 ->
mysql> SELECT '9223372036854775807' = 9223372036854775807;
        -> 1
mysql> SELECT '9223372036854775807' = 9223372036854775806;
        -> 1
1 Chuyển đổi là không mất trừ khi
mysql> SELECT '9223372036854775807' = 9223372036854775807;
        -> 1
mysql> SELECT '9223372036854775807' = 9223372036854775806;
        -> 1
1 là
mysql> SELECT CAST('9223372036854775807' AS UNSIGNED) = 9223372036854775806;
        -> 0
4,
mysql> SELECT CAST('9223372036854775807' AS UNSIGNED) = 9223372036854775806;
        -> 0
5 hoặc
mysql> SELECT CAST('9223372036854775807' AS UNSIGNED) = 9223372036854775806;
        -> 0
6. Các giá trị sau không được hỗ trợ vì tiêu chuẩn SQL định nghĩa chúng là giá trị không hợp lệ cho
SELECT * FROM tbl_name WHERE str_col=1;
4 hoặc
SELECT * FROM tbl_name WHERE str_col=1;
5.

Đối với

SELECT * FROM tbl_name WHERE str_col=1;
9 ->
mysql> SELECT '9223372036854775807' = 9223372036854775807;
        -> 1
mysql> SELECT '9223372036854775807' = 9223372036854775806;
        -> 1
1 ->
SELECT * FROM tbl_name WHERE str_col=1;
9 Chuyển đổi, một điều kiện đủ cho sự không mất mát là
SELECT * FROM tbl_name WHERE str_col=1;
9 sử dụng 15 hoặc ít hơn các chữ số chính xác, không phải là giá trị phi bình thường,
mysql> SELECT CAST('9223372036854775807' AS UNSIGNED) = 9223372036854775806;
        -> 0
4,
mysql> SELECT CAST('9223372036854775807' AS UNSIGNED) = 9223372036854775806;
        -> 0
5 hoặc
mysql> SELECT CAST('9223372036854775807' AS UNSIGNED) = 9223372036854775806;
        -> 0
6. Trong một số trường hợp, việc chuyển đổi là không mất mát ngay cả khi
SELECT * FROM tbl_name WHERE str_col=1;
9 có hơn 15 chữ số độ chính xác, nhưng điều này không phải lúc nào cũng đúng.

Chuyển đổi tiềm ẩn của 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

CREATE TABLE t SELECT integer_expr;
7 và
CREATE TABLE t SELECT integer_expr;
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) (giá trị

CREATE TABLE t SELECT 000000000000000000000;
0,
CREATE TABLE t SELECT 000000000000000000000;
1 hoặc
CREATE TABLE t SELECT 000000000000000000000;
2), ngoại trừ trong trường hợp ký tự kết nối được đặt thành
CREATE TABLE t SELECT 000000000000000000000;
3. Trong trường hợp đó, kết quả chuyển đổi là một chuỗi nhị phân (giá trị
CREATE TABLE t SELECT 000000000000000000000;
4,
CREATE TABLE t SELECT 000000000000000000000;
5 hoặc
CREATE TABLE t SELECT 000000000000000000000;
6).

Đố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 nhau để gán biểu thức; Ví dụ, trong một tuyên bố như thế này:evaluation apply somewhat differently for expression assignment; for example, in a statement such as this:

CREATE TABLE t SELECT integer_expr;

Trong trường hợp này, bảng trong cột kết quả từ biểu thức có loại

CREATE TABLE t SELECT 000000000000000000000;
7 hoặc
CREATE TABLE t SELECT 000000000000000000000;
8 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 phù hợp với
CREATE TABLE t SELECT 000000000000000000000;
7,
CREATE TABLE t SELECT 000000000000000000000;
8 được sử dụng thay thế. Độ dài được lấy từ giá trị CAST()1 của siêu dữ liệu tập hợp kết quả CAST()2 (xem C Cấu trúc dữ liệu cơ bản C API). Điều này có nghĩa là bạn có thể buộc
CREATE TABLE t SELECT 000000000000000000000;
8 thay vì
CREATE TABLE t SELECT 000000000000000000000;
7 bằng cách sử dụng một biểu thức đủ dài:

CREATE TABLE t SELECT 000000000000000000000;