2012-05-01 26 views
5

MySQL belgeleri 5.0'dan beri varchar uzunluklarının bayt değil karakter birimine başvurduğunu söylüyor. Ancak, kısa bir süre önce, belirttiğim varchar sütununa sığması gereken değerleri eklerken, kesilmiş veri uyarıları aldığım bir soruna rastladım. MySQL UTF8 varchar sütun boyutu

Ben

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) 

Sonra UTF8 karakter Farklı miktardaki ile birden fazla 10 karakter değerleri takılı

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) 

Bu gösteriyor ki düşünüyorum v5.1 basit bir tabloyla bu sorunu çoğaltılmış varchar boyutu hala bayt cinsinden tanımlanır veya en azından karakter birimlerinde doğru değildir.

Sorun şu ki, belgeleri doğru anlıyor muyum ve bu bir hatadır? Yoksa belgeleri yanlış yorumlu muyum?

+1

En ufak bir sorun değil ama 5.5.20 olduğunu iddia eden [sqlfiddle] 'da (http://sqlfiddle.com/#!2/829b8/2) size bu sorun yaşanmaz. Belki de o zamandan beri düzeltilmiş bir hataydı (aradım ama bir hata raporu bulamadım). – eggyal

+0

Aynı sorun 5.5.19'da bulunmaktadır, bu nedenle düzeltilen sürüm olabilir. Sürüm notlarının bir kontrolü, varchars veya UTF8 – sreimer

cevap

7

VARCHAR ve CHAR boyutlarının bayt değil karakter olarak kabul edildiği doğrudur.

Bağlantı karakter kümemi latin1 (tek bayt) olarak ayarladığımda sorununuzu yeniden oluşturabiliyordum. Bunu yapmazsanız

SET NAMES utf8 

, iki baytlık UTF8 karakter olarak gönderilir alacak:

önce şu komutla yerleştirme sorguyu çalıştırmadan bağlantınızın karakter UTF8 olarak ayarlanmış koymasını sağlamak iki tek baytlı karakter.

default client character set numaralı telefonu değiştirmeyi düşünebilirsiniz.

+0

'dan bahsetmez. Bu gerçekten problemdi. Hatalı karakter kümesi kullanılmışsa, sonuçta oluşan kaydın yanlış görüntülenmesi bekleniyordu. – sreimer