【问题标题】:Cannot store UTF8 characters in MySQL无法在 MySQL 中存储 UTF8 字符
【发布时间】:2011-11-18 11:27:20
【问题描述】:

找不到我无法在 MySQL 数据库中存储 ţ、î、ş 等字符的原因。

我的表定义是:

CREATE TABLE IF NOT EXISTS `gen_admin_words_translated` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `word_id` int(10) NOT NULL,
  `value` text COLLATE utf8_unicode_ci,
  `lang_id` int(2) NOT NULL,
  `needUpd` int(1) NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2689 ;

与数据库的连接是通过以下脚本完成的:

$charset = "UTF8";
$link = mysql_connect($host, $user, $pass);
if(!$link){
    die("Unable to connect to database server.");
}
mysql_selectdb($database);
if(function_exists("mysql_set_charset")){
    mysql_set_charset($charset, $link);
}else{
    mysql_query("SET NAMES $charset");   
}

我在页面的头部:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

脚本是:

$text = 'ţ, î, ş';
mysql_query("insert into gen_admin_words_translated (word_id, lang_id, value, needUpd) values (1, 1, '$text', 1)");

我最后在表格中得到的是:

SELECT * FROM  `gen_admin_words_translated` 

id   word_id value lang_id needUpd
5166 1034    ?,    1       1

【问题讨论】:

  • 由于您尝试插入字符文字...您的脚本的文本编码(保存在磁盘上)是否也是 UTF-8?
  • @Jon:我该如何检查?我在服务器上运行脚本,而不是在本地运行。
  • 取决于您的编辑器,但您也可以进行快速而肮脏的检查:将字符 添加到文件中的某个位置并保存。如果文件大小改变了 1 或 2 个字节而不是 3,则说明您不在 UTF-8 上。

标签: php mysql utf-8 character-encoding


【解决方案1】:

当我运行你的脚本时,它对我有用:

$charset = "UTF8";
$link = mysql_connect('localhost', 'root', '') or die('connection?');
mysql_select_db('test') or die('database?');
if(function_exists("mysql_set_charset")){
    mysql_set_charset($charset, $link);
}else{
    mysql_query("SET NAMES $charset");   
}

$text = 'ţ, î, ş';
mysql_query("insert into gen_admin_words_translated (word_id, lang_id, value, needUpd) values (1, 1, '$text', 1)");

$query = mysql_query('SELECT * FROM  `gen_admin_words_translated`');
$array = mysql_fetch_array($query);

print_r($array)

结果:

Array
(
    [0] => 2689
    [id] => 2689
    [1] => 1
    [word_id] => 1
    [2] => ţ, î, ş
    [value] => ţ, î, ş
    [3] => 1
    [lang_id] => 1
    [4] => 1
    [needUpd] => 1
)

检查事项:

检查您的网页是否真的是 UTF-8,也许您在其他地方设置了一些追逐。

header('Content-type: text/html; charset=utf-8');

文件编码也应该是 UTF-8,否则可能会破坏您的字符..

【讨论】:

  • 他网页的编码与MySql无关。
  • 他网页的编码与插入有关,如果页面不是UTF8,字符甚至不会进入数据库。尝试打开记事本,输入这些字符并将其作为 ANSI 关闭,您会发现它会破坏字符。
  • 对不起,我的错误是不准确。我的意思是他现在正在尝试的事情(不起作用)与他的网页无关。此外,他在那里有一个meta 标签,虽然不理想,但对于浏览器来说应该足够了。
  • 谢谢米海。这是我的编辑器的问题,因为它没有以 UTF8 编码。
【解决方案2】:

您粘贴的最后一个结果是否来自 MySQL 命令行?如果是,请在查询SELECT * FROM gen_admin_words_translated 之前尝试SET NAMES utf8;

【讨论】:

  • 他已经这样做了。你读过代码吗? (我可以对支持者说同样的话)
  • 是的,他做到了,但只是在 PHP 代码中,对吧?我不确定他是否使用 MySQL 命令行或其他工具来执行 SELECT 查询。
【解决方案3】:

如果这样:

$text = 'ţ, î, ş';

是您的文字代码,您需要确保 PHP 源文件也被编码为 UTF-8。否则,这些字符将是 Unicode 上下文中的 ISO-8859-1 字符,从而导致字符损坏。

【讨论】:

    【解决方案4】:

    在此语句中,您插入的是当前 PHP 文件中存在的字符:

    $text = 'ţ, î, ş';
    

    但是,它们将使用 PHP 文件的字符编码进行编码。除非这个 PHP 文件本身使用 UTF-8 编码,否则生成的字符串不会是 UTF-8 编码的。

    您应该使用文本编辑器检查当前文件使用的字符编码。所有体面的文本编辑器都应该能够显示文档中使用的字符编码,有些甚至可以转换。

    要创建更便携的代码,确保文档的字符编码无关紧要,您可以使用如下编码值:

    $text = "\xC5\xA3, \xC3\xAE, \xC5\x9F";
    

    不幸的是,如果你必须做很多这样的事情会很痛苦,因为你必须使用多字节十六进制表示 - PHP 没有像其他一些语言那样指定字符的原生 Unicode 方式(你可以去哪里“\u163”而不是“\xC5\xA3”)。

    您可以使用 tools like this 以十六进制形式查找 UTF-8 表示。

    【讨论】:

      【解决方案5】:

      将我的 cmets 扩展为答案:

      您似乎已经正确设置了一些东西,并且只停留在将字符串文字插入数据库中。要成功地做到这一点,您还必须确保保存的 PHP 脚本的文本编码也是 UTF-8

      大多数体面的编辑器都会让您知道您当前正在使用哪种编码,并且还可以另存为(即在之间转换)不同的编码(甚至今天的记事本也这样做)。但是,作为快速检查,您可以将字符 添加到文件中的某个位置并保存。如果文件大小改变了 1 或 2 个字节而不是 3,则说明您不在 UTF-8 上,您需要将文件转换为该编码。

      除此之外,当从浏览器接收文本作为输入时,您的代码应该可以很好地处理它。

      注意:虽然使用&lt;meta&gt; 标记为您的页面设置编码就足够了,但最好使用来自PHP 的HTTP 标头,如下所示:

      header('Content-type: text/html; charset=utf-8');
      

      【讨论】:

      • 感谢乔恩。我花了一个多小时来处理这样一个愚蠢的事情。事实上,我的即兴编辑器没有使用 UTF-8 编码。
      【解决方案6】:

      检查您的 MySQL 初始化文件。它应该包括这些字符集行:

      [client]
      port=3306
      
      [mysql]
      default-character-set=utf8
      port = 3306
      #
      [mysqld]
      basedir=".....
      #Path to the database root
      datadir=".....
      # The default character set that will be used when a new schema or table is
      # created and no character set is defined
      character-set-server=utf8
      

      【讨论】:

      • 这个答案现在已被弃用,因为默认字符集应该是utf8mb4,而不是utf8,因为 MySQL 中的utf8 被限制为 3 个字节并且不能代表所有 Unicode 字符。
      猜你喜欢
      • 2013-01-22
      • 2012-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-06
      • 1970-01-01
      • 2012-08-22
      • 2011-03-14
      相关资源
      最近更新 更多