代码之家  ›  专栏  ›  技术社区  ›  bradgonesurfing

是“VARCHAR(255)CHARACTER SET utf8”255字节还是255个字符

  •  5
  • bradgonesurfing  · 技术社区  · 16 年前

    VARCHAR(255) CHARACTER SET utf8 NOT NULL
    

    但是,在插入数据时,我的数据被截断为255字节而不是字符。这个 可能会把后面的两个代码点i切掉 n 2留下一个无效字符。 你知道我做错了什么吗

    编辑:

    mysql> update channel set comment="ᚠᛇᚻ᛫ᛒᛦᚦ᛫ᚠᚱᚩᚠᚢᚱ᛫ᚠᛁᚱᚪ᛫ᚷᛖᚻᚹᛦᛚᚳᚢᛗ ᛋᚳᛖᚪᛚ᛫ᚦᛖᚪᚻ᛫ᛗᚪᚾᚾᚪ᛫ᚷᛖᚻᚹᛦᛚᚳ᛫ᛗᛁᚳᛚᚢᚾ᛫ᚻᛦᛏ᛫ᛞᚫᛚᚪᚾᚷᛁᚠ᛫ᚻᛖ᛫ᚹᛁᛚᛖ᛫ᚠᚩᚱ᛫ᛞᚱᛁᚻᛏᚾᛖ᛫ᛞᚩᛗᛖᛋ᛫ᚻᛚᛇᛏᚪᚾ᛬x" where id = 1;
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    Rows matched: 1  Changed: 0  Warnings: 1
    
    mysql> select id, channelName, comment from channel;
    +----+-------------+------------------------------------------------------------------------------------------
    | id | channelName | comment                                                                                                                                                                                                                                                         |
    +----+-------------+-----------------------------------------------------------------------------------------
    |  1 | foo         | ᚠᛇᚻ᛫ᛒᛦᚦ᛫ᚠᚱᚩᚠᚢᚱ᛫ᚠᛁᚱᚪ᛫ᚷᛖᚻᚹᛦᛚᚳᚢᛗ ᛋᚳᛖᚪᛚ᛫ᚦᛖᚪᚻ᛫ᛗᚪᚾᚾᚪ᛫ᚷᛖᚻᚹᛦᛚᚳ᛫ᛗᛁᚳᛚᚢᚾ᛫ᚻᛦᛏ᛫ᛞᚫᛚᚪᚾᚷᛁᚠ᛫ᚻᛖ᛫ᚹᛁᛚᛖ᛫ᚠᚩ�� |
    +----+-------------+-----------------------------------------------------------------------------------------
    1 row in set (0.00 sec)
    

    我通过mysql admin查看comment字段,发现它确实是VARCHAR(255)并且使用“UTF-8unicode”

    show full columns from channel
    

    我明白了

    +-----------------------------+------------------+-----------------+------+-----+---------+----------------+---------------------------------+---------+
    | Field                       | Type             | Collation       | Null | Key | Default | Extra          | Privileges                      | Comment |
    +-----------------------------+------------------+-----------------+------+-----+---------+----------------+---------------------------------+---------+
    | id                          | int(11)          | NULL            | NO   | PRI | NULL    | auto_increment | select,insert,update,references |         |
    | channelName                 | varchar(255)     | utf8_general_ci | NO   |     | NULL    |                | select,insert,update,references |         |
    | comment                     | varchar(255)     | utf8_general_ci | NO   |     | NULL    |                | select,insert,update,references |         |
    +-----------------------------+------------------+-----------------+------+-----+---------+----------------+---------------------------------+---------+
    

    mysql>显示“character\u set%”等变量

    +--------------------------+----------------------------+
    | Variable_name            | Value                      |
    +--------------------------+----------------------------+
    | character_set_client     | latin1                     |
    | character_set_connection | latin1                     |
    | character_set_database   | latin1                     |
    | character_set_filesystem | binary                     |
    | character_set_results    | latin1                     |
    | character_set_server     | latin1                     |
    | character_set_system     | utf8                       |
    | character_sets_dir       | /usr/share/mysql/charsets/ |
    +--------------------------+----------------------------+
    
    2 回复  |  直到 16 年前
        1
  •  2
  •   Hammerite    16 年前

    这是暗箭伤人,但您是否使用UTF-8作为连接和客户机字符集?发行 SHOW VARIABLES LIKE 'character_set%'

    如果您使用了错误的连接/客户机字符集,UTF-8字节可能会被重新解释为单字节字符,并以这种方式存储在数据库中。

        2
  •  7
  •   Pekka    16 年前

    manual ,你应该很好:

    MySQL以字符单位解释字符列定义中的长度规范(在MySQL 4.1之前,列长度是以字节来解释的。)这适用于CHAR、VARCHAR和文本类型。

    你使用的是4.1之前版本的mySQL吗?