【问题标题】:Unicode Characters with MysqlMysql 中的 Unicode 字符
【发布时间】:2018-01-23 22:43:19
【问题描述】:

我在 MySql 数据库中设置了我的字符集“utf8 turkish ci”。因为我会在我的项目中存储一些土耳其语字符。我可以正确输入土耳其字符并看到它们。但我的问题是:

例如,我将“用户名”定义为 varhar(20),输入框的最大长度为 20。这意味着用户不能写任何超过 20 个字符的用户名。但是当用户使用土耳其语 unicode 字符(如 ş,i,ü,ğ)时,会出现“Data too long for column 'username'”错误,因为 unicode 字符是 2 个字节长!

我尝试使用 phpmyadmin 更新我的数据库。但是更新长度会带来更多错误。那么我是否必须删除所有表格并用 x2 长度编写它们? (我的意思是如果数据是 20 个字符,我将其定义为 varchar(40) )我有 30 个表,这是一场噩梦。有什么办法吗?

【问题讨论】:

  • 是的,字段是 varchar(20) utf8_turkish_ci。我尝试输入 10 个 unicode 字符,没有错误。但是当我尝试输入 11 个 unicode 字符时,会导致“太长”错误。所以我看到 unicode 字符使用 2 个字节。并且必须更改我所有的数据库:(
  • utf8_unicode_ci (utf8mb4_unicode_ci) 是这样的东西。更多阅读:stackoverflow.com/a/766996/2960971dev.mysql.com/doc/refman/5.7/en/charset-unicode-sets.html
  • 你在哪里看到这个“太长”的错误,是什么决定的?这是您实际上从 mysql 中得到的错误,还是 php 出现的错误,因为它正在执行某种初步的字符串计数?
  • 我认为this 会帮助你,VARCHARCHAR 长度定义只考虑字符长度,而不考虑每个字符的字节数。你在使用 InnoDb 吗?你应该看看restrictions

标签: php mysql unicode


【解决方案1】:

默认情况下,MySQL 将使用 3 个字节来存储指定为 UTF8 的 VARCHAR 的任何字符(或 UTF8MB4 的 4 个字节)。

VARCHAR(10) 实际上 确实 表示 10 个字符,30 个字节。这并不意味着 10 个字节。

【讨论】:

  • 不,它不“使用 3 个字节”,它“使用 最多 3 个字节”。英文字母占1个字节;西欧重音字母取 2;等等。土耳其语的 UTF-8 字符分别为 1 或 2 个字节,里拉除外。
  • @RickJames 您在通常谈论 UTF-8 时是正确的,但 MySQL 不以这种方式处理它是一个常见的混淆。因此,当您将列指定为 UTF-8 时,MySQL 绝对会在其底层存储引擎中将其存储为每个字符 3 个字节。
  • 这很容易测试,但这里有一个参考:dev.mysql.com/doc/refman/5.7/en/charset-unicode-utf8.html
  • VARCHAR(10)...utf8被实现为一个长度字段(1字节)和最多30字节的文本。如果将'A' 存储到这样的列中,则占用的空间为 2 个字节(长度为 1,字符为 1)。存储土耳其语'ü' 需要 3 个字节(长度为 1,十六进制 C3BC 为 2,utf8 编码为“带分音符号的小写字母 u”。
  • 这是一个有趣的理论。但这是错误的。还是你有某种形式的“证明”?
【解决方案2】:

我怀疑您的 <form> 需要包含字符集:<form accept-charset="UTF-8">

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-18
    • 2011-07-06
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 2011-05-14
    • 2010-10-20
    • 2012-02-15
    相关资源
    最近更新 更多