2012-05-01 15 views
5

MySQLのマニュアルによると、5.0以降、varcharの長さは文字単位でありバイトではありません。しかし、私は最近、指定されたvarchar列に収まるはずの値を挿入するときに、切り捨てられたデータの警告が出るという問題に直面しました。 MySQL UTF8 varcharカラムサイズ

は私が

mysql> show create table test\G 
*************************** 1. row *************************** 
Table: test 
Create Table: CREATE TABLE `test` (
    `string` varchar(10) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 
1 row in set (0.00 sec) 

は、私はその後、UTF8文字の異なる量で複数の10文字の値を挿入

mysql> insert into test (string) values 
    -> ('abcdefghij'), 
    -> ('ãáéíçãáéíç'), 
    -> ('ãáéíç67890'), 
    -> ('éíç4567890'), 
    -> ('íç34567890'); 
Query OK, 5 rows affected, 4 warnings (0.06 sec) 
Records: 5 Duplicates: 0 Warnings: 4 

mysql> show warnings; 
+---------+------+---------------------------------------------+ 
| Level | Code | Message          | 
+---------+------+---------------------------------------------+ 
| Warning | 1265 | Data truncated for column 'string' at row 2 | 
| Warning | 1265 | Data truncated for column 'string' at row 3 | 
| Warning | 1265 | Data truncated for column 'string' at row 4 | 
| Warning | 1265 | Data truncated for column 'string' at row 5 | 
+---------+------+---------------------------------------------+ 

mysql> select * from test; 
+------------+ 
| string  | 
+------------+ 
| abcdefghij | 
| ãáéíç | 
| ãáéíç | 
| éíç4567 | 
| íç345678 | 
+------------+ 
5 rows in set (0.00 sec) 

私は、このことを示していると思いV5.1で簡単な表で、この問題を複製しvarcharのサイズはまだバイト単位で定義されているか、少なくとも文字単位では正確ではありません。

質問は正しくドキュメントを理解していますが、これはバグですか?または私はドキュメントを誤解していますか?

+1

しかし、それは少しでも役立ちますが、5.5.20と主張している[sqlfiddle](http://sqlfiddle.com/#!2/829b8/2)では、この問題は発生しません。おそらくそれは修正されたバグでした(私は検索しましたが、バグレポートを見つけていません)。 – eggyal

+0

同じ問題が5.5.19に存在するため、修正されたバージョンかもしれません。リリースノートのチェックでは、varcharsやUTF8については触れていません – sreimer

答えて

7

VARCHARとCHARのサイズはバイトではなく文字であると考えられます。

接続文字セットをlatin1(1バイト)に設定すると、問題を再現することができました。これを行わないと

SET NAMES utf8 

、2バイトのUTF8文字は次のように送信されます:

前に、次のコマンドを使用して挿入クエリを実行するには、あなたの接続文字がUTF8に設定していることを確認してください2つのシングルバイト文字。

default client character setを変更することをおすすめします。

+0

これは本当に問題でした。私は誤った文字セットが使用された場合、結果のレコードが正しく表示されないことを期待していました。 – sreimer