<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>realsatan (rsatan)</title>
    <link>https://ruby-china.org/realsatan</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>Ruby 访问 MySQL 字符编码问题</title>
      <description>&lt;p&gt;正在学 Active Record，需要从 PHP 访问的数据库中读取中文字段，遇到乱码。&lt;/p&gt;

&lt;p&gt;经过测试，发现数据库中正常的 UTF8 编码数据不能正确读入到 Ruby 中。&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;在 MySQL 命令行中，分别用两种编码插入“中文”，PHP 也是使用 UTF8 的方式：&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="k"&gt;NAMES&lt;/span&gt; &lt;span class="n"&gt;Latin1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;insert&lt;/span&gt; &lt;span class="k"&gt;into&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;"中文"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;"none"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="k"&gt;NAMES&lt;/span&gt; &lt;span class="n"&gt;UTF8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;insert&lt;/span&gt; &lt;span class="k"&gt;into&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;"中文"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;"none"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="结果（Latin1）："&gt;结果（Latin1）：&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2015/f5862655452d90a5a09a502c08db5fa4.png" title="" alt=""&gt;&lt;/p&gt;
&lt;h3 id="结果（UTF8）："&gt;结果（UTF8）：&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2015/31c745577f4242842ab4dfd6c127cccc.png" title="" alt=""&gt;&lt;/p&gt;
&lt;h3 id="在Ruby（Active Record）中，只能直接读取Latin1编码，UTF8为乱码。"&gt;在 Ruby（Active Record）中，只能直接读取 Latin1 编码，UTF8 为乱码。&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2015/c8d554e89de1a825a50131efd544ae73.png" title="" alt=""&gt;&lt;/p&gt;
&lt;h3 id="使用 gem mysql 来直接查表："&gt;使用 gem mysql 来直接查表：&lt;/h3&gt;&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;my&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Mysql&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;real_connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;"**"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;res1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;my&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;"select * from users;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;res1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;结果：
["1", "\xE4\xB8\xAD\xE6\x96\x87", "none"]
["2", "??", "none"]&lt;/p&gt;

&lt;p&gt;增加 SET NAMES&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;my&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;"set names utf8"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;res2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;my&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;"select * from users;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;res2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;结果：
["1", "\xC3\xA4\xC2\xB8\xC2\xAD\xC3\xA6\xE2\x80\x93\xE2\x80\xA1", "none"]
["2", "\xE4\xB8\xAD\xE6\x96\x87", "none"]&lt;/p&gt;

&lt;p&gt;用 SET NAMES 能解决 Ruby 读取 MySQL 中文的问题，但是使用 Active Record 没有这个步骤，请问解决方法。&lt;/p&gt;</description>
      <author>realsatan</author>
      <pubDate>Wed, 11 Nov 2015 22:39:02 +0800</pubDate>
      <link>https://ruby-china.org/topics/28027</link>
      <guid>https://ruby-china.org/topics/28027</guid>
    </item>
  </channel>
</rss>
