53

たとえば、CLIからデータベースとテーブルを作成し、いくつかのデータを挿入します。

CREATE DATABASE testdb CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
USE testdb;
CREATE TABLE test (id INT, str VARCHAR(100)) TYPE=innodb CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
INSERT INTO test VALUES (9, 'some string');

今、私はこれを行うことができ、これらの例は機能します(したがって、引用符は見た目には影響しません):

SELECT * FROM test WHERE id = '9';
INSERT INTO test VALUES ('11', 'some string');

したがって、これらの例では、実際にmysqlにINTとして格納されている文字列で行を選択してから、INTであるに文字列を挿入しました。

なぜこれがここで機能するのかよくわかりません。INT列に文字列を挿入できるのはなぜですか?

すべてのMySQLデータ型を文字列として挿入できますか?

この動作は、さまざまなRDBMS間で標準ですか?

4

8 に答える 8

4

これをチェックしてください、あなたはよりよく理解することができます...

mysql> EXPLAIN SELECT COUNT(1) FROM test_no WHERE varchar_num=0000194701461220130201115347;
+----+-------------+------------------------+-------+-------------------+-------------------+---------+------+---------+--------------------------+
| id | select_type | table                  | type  | possible_keys     | key                  | key_len | ref  | rows    | Extra                    |
+----+-------------+------------------------+-------+-------------------+-------------------+---------+------+---------+--------------------------+
|  1 | SIMPLE      | test_no | index | Uniq_idx_varchar_num | Uniq_idx_varchar_num | 63      | NULL | 3126240 | Using where; Using index |
+----+-------------+------------------------+-------+-------------------+-------------------+---------+------+---------+--------------------------+
1 row in set (0.00 sec)

mysql> EXPLAIN SELECT COUNT(1) FROM test_no WHERE varchar_num='0000194701461220130201115347';
+----+-------------+------------------------+-------+-------------------+-------------------+---------+-------+------+-------------+
| id | select_type | table                  | type  | possible_keys     | key               | key_len | ref   | rows | Extra       |
+----+-------------+------------------------+-------+-------------------+-------------------+---------+-------+------+-------------+
|  1 | SIMPLE      | test_no | const | Uniq_idx_varchar_num | Uniq_idx_varchar_num | 63      | const |    1 | Using index |
+----+-------------+------------------------+-------+-------------------+-------------------+---------+-------+------+-------------+
1 row in set (0.00 sec)

mysql>
mysql>
mysql> SELECT COUNT(1) FROM test_no WHERE varchar_num=0000194701461220130201115347;
+----------+
| COUNT(1) |
+----------+
|        1 |
+----------+
1 row in set, 1 warning (7.94 sec)

mysql> SELECT COUNT(1) FROM test_no WHERE varchar_num='0000194701461220130201115347';
+----------+
| COUNT(1) |
+----------+
|        1 |
+----------+
1 row in set (0.00 sec)
于 2013-04-23T07:53:17.147 に答える
0

問題は、users というテーブルがあり、このクエリを実行すると、FLOAT 型の current_balance という列があるとします。

UPDATE `users` SET `current_balance`='231608.09' WHERE `user_id`=9;

current_balance フィールドは 231608 に更新されます。これは、次のクエリを試す場合と同様に、MySQL が丸めを行うためです。

UPDATE `users` SET `current_balance`='231608.55' WHERE `user_id`=9;

current_balance フィールドは 231609 に更新されます

于 2014-06-14T17:58:07.643 に答える