Using utf8mb4 with php and mysql

前端 未结 4 2044
时光取名叫无心
时光取名叫无心 2020-12-02 14:42

I have read that mysql >= 5.5.3 fully supports every possible character if you USE the encoding utf8mb4 for a certain table/column http://mathiasbynens.be/n

相关标签:
4条回答
  • 2020-12-02 15:26

    This is what i used, and worked good for my problem using euro € sign and conversion for json_encode failure.

    php configurations script( api etc..)

    header('Content-Type: text/html; charset=utf-8');
    ini_set("default_charset", "UTF-8");
    mb_internal_encoding("UTF-8");
    iconv_set_encoding("internal_encoding", "UTF-8");
    iconv_set_encoding("output_encoding", "UTF-8");
    

    mysql tables / or specific columns

    utf8mb4
    

    mysql PDO connection

    $dsn = 'mysql:host=yourip;dbname=XYZ;charset=utf8mb4';
    

    (...your connection ...)

    before execute query (might not be required):

    $dbh->exec("set names utf8mb4");
    
    0 讨论(0)
  • 2020-12-02 15:30
    • utf-32: This is a character encoding using a fixed 4-bytes per characters
    • utf-8: This is a character encoding using up to 4 bytes per characters, but the most frequent characters are coded on only 1, 2 or 3 characters.

    MySQL's utf-8 doesn't support characters coded on more than 3 characters, so they added utf-8mb4, which is really utf-8.

    0 讨论(0)
  • 2020-12-02 15:31

    Before running your actual query, do a mysql_query ('SET NAMES utf8mb4')

    Also make sure your mysql server is configured to use utf8mb4 too. For more information on how, refer to article: https://mathiasbynens.be/notes/mysql-utf8mb4#utf8-to-utf8mb4

    0 讨论(0)
  • 2020-12-02 15:33

    MySQL's utf8 encoding is not actual UTF-8. It's an encoding that is kinda like UTF-8, but only supports a subset of what UTF-8 supports. utf8mb4 is actual UTF-8. This difference is an internal implementation detail of MySQL. Both look like UTF-8 on the PHP side. Whether you use utf8 or utf8mb4, PHP will get valid UTF-8 in both cases.

    What you need to make sure is that the connection encoding between PHP and MySQL is set to utf8mb4. If it's set to utf8, MySQL will not support all characters. You set this connection encoding using mysql_set_charset(), the PDO charset DSN connection parameter or whatever other method is appropriate for your database API of choice.


    mb_internal_encoding just sets the default value for the $encoding parameter all mb_* functions have. It has nothing to do with MySQL.

    UTF-8 and UTF-32 differ in how they encode characters. UTF-8 uses a minimum of 1 byte for a character and a maximum of 4. UTF-32 always uses 4 bytes for every character. UTF-16 uses a minimum of 2 bytes and a maximum of 4.
    Due to its variable length, UTF-8 has a little bit of overhead. A character which can be encoded in 2 bytes in UTF-16 may take 3 or 4 in UTF-8; on the other hand, UTF-16 never uses less than 2 bytes. If you're storing lots of Asian text, UTF-16 may use less storage. If most of your text is English/ASCII, UTF-8 uses less storage. UTF-32 always uses the most storage.

    0 讨论(0)
提交回复
热议问题