MySQL VARCHAR(156)不存储156多字节字符


MySQL VARCHAR(156) not storing 156 Multi-Byte Characters?

我有一个以UTF-8格式编码的156个字符的多字节文本,并由PHP函数mb_strlen($text, 'UTF-8')验证为156个长度。我希望能够存储所有的VARCHAR(156)。但是有很大一部分文字被截断了。

这是我的原文:

大黄蜂,大黄蜂,大黄蜂。

(λ -, lambda -)。1930年:함수s (x, y) = x x +입력x것이다。X→X→y。또한(x, y)↦x x + y y와(u, v)↦u u + v *는.123456

这是我在MySQL中得到的:

ìœ " í,¤ë°±ê³¼,백과ì,¬ì " .

대ì´~ (λ-,lambda -)ëŠ " 함。1930 e…"eœ€e喜爱¤。함ì ø s(x, y) = x*x +ìž…ë¥x 것ì´ë·¤。X †μ X ì™- y †μ y ëŠ " ë³- ì´≈ì

这是在我的网页上查询时生成的结果:

大黄蜂,大黄蜂,大黄蜂。

(λ -, lambda -)。1930年:"""""""""。X→X→y

在Stack Overflow上有一个类似的问题,但它似乎没有解决我的问题。注意,表CHARSET=utf8排序规则已更改为UTF-8, General CI,列排序规则使用表默认值。我使用MySQL 5.5.14版本,系统变量如下所示:

+--------------------------+----------------------------------------+
| Variable_name            | Value                                  |
+--------------------------+----------------------------------------+
| character_set_client     | utf8                                   |
| character_set_connection | utf8                                   |
| character_set_database   | utf8                                   |
| character_set_filesystem | binary                                 |
| character_set_results    | utf8                                   |
| character_set_server     | utf8                                   |
| character_set_system     | utf8                                   |
| character_sets_dir       | /usr/local/mysql/share/mysql/charsets/ |
| collation_connection     | utf8_general_ci                        |
| collation_database       | utf8_general_ci                        |
| collation_server         | utf8_general_ci                        |
+--------------------------+----------------------------------------+

更新:

根据Homer6的建议,在PHP脚本上运行mysqli_query($cxn, "SET NAMES utf8")后,它确实接受了完整的156个字符,并按照我的原始文本呈现。

但是现在在我的网页上生成的内容变成:

? ?, ? ?。(?-, lambda -)??。1930 ? ??。?? S (x, y) = xx + ??x? ?。x ?x ?y ?y ???? ? ?。?? (x, y) ?X X + yy ?(u, v) ?u u +v * ? .123456

有人能帮我吗?

你能不能试着把大小翻四倍到624?我认为大小是以字节为单位,而不是字符。UTF-8可以在1到4字节之间。

见http://unicode.org/faq/utf_bom.html

还有,你是否设置

SET NAMES 'utf8';

在运行查询之前?

或者,对于韩语,如果你设置

mysql_query( 'SET NAMES euckr_korean_ci' );
查询前的

?

http://dev.mysql.com/doc/refman/5.1/en/charset-asian-sets.html

这取决于MySQL的版本。在MySQL 4和更早的版本中,长度以字节为单位。在MySQL 5及以后版本中,长度以字符为单位。

另外,MySQL 5的列需要设置为utf8_unicode_ci,以正确计算字符数。

我很确定mb_strlen返回字符数,而不是字符串的大小。

虽然UTF-8是每个ascii字符1个字节,但对于其他语言/字符集来说并非如此。直到1930年代,汉字的数量大约是45个。这是有道理的,因为韩文字符每个字符占用3字节(我认为)

还必须显式地将字符集设置为utf8,参见http://dev.mysql.com/doc/refman/5.0/en/string-type-overview.html

您可以使用以下命令修改表:ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;

运行SHOW CREATE TABLE [TABLE_NAME];查看列的字符集。也就是说,它应该输出'column_name' varchar(156) character set utf8 default NULL,