【发布时间】:2014-06-27 14:12:17
【问题描述】:
考虑下表:
CREATE TABLE t1 (f1 VARCHAR(255));
那就是ruby:
#!/usr/bin/env ruby
require 'json'
require 'sequel'
require 'mysql2'
DB = Sequel.connect(
:adapter => 'mysql2',
:database => 'd1',
:user => '<user>',
:password => '<password>',
:encoding => 'utf8')
v1 = '{"a":"b\ud83c\udf4ec"}'
v2 = JSON.parse(v1)
p v2['a']
DB[:t1].truncate
DB[:t1].insert(f1: v2['a']);
p DB[:t1].first[:f1]
或php:
#!/usr/bin/env php
<?php
$dbh = new PDO('mysql:dbname=d1', '<user>', '<password>', [
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);
$dbh->exec('TRUNCATE TABLE t1');
$v1 = '{"a":"b\ud83c\udf4ec"}';
$v2 = json_decode($v1);
var_dump($v2->a);
$sth = $dbh->prepare("INSERT INTO t1 VALUES (?)");
$sth->execute([$v2->a]);
$sth = $dbh->query("SELECT * FROM t1");
var_dump($sth->fetch()['f1']);
进入数据库的是b。我正在运行mysql-5.1 和文档says:
MySQL 5.1 支持两种字符集来存储 Unicode 数据:
ucs2,Unicode 字符集的 UCS-2 编码,每个字符使用 16 位。
utf8,Unicode 字符集的 UTF-8 编码,每个字符使用一到三个字节。这两个字符集支持来自 Unicode 3.0 版基本多语言平面 (BMP) 的字符。 BMP 字符具有以下特点:
- 它们的代码值介于 0 和 65535(或
U+0000..U+FFFF)之间。
我做错了什么?
UPD
$ mysql -BNe 'SHOW CREATE TABLE t1' d1
t1 CREATE TABLE `t1` (\n `f1` varchar(255) DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8
【问题讨论】:
-
你能检查一下你的桌子
COLLATION吗?它应该是utf8_unicode_ci或utf8_general_ci。当您创建表时,它使用 MySQL 默认排序规则,通常是latin1