mysql装在centos下。修改my.conf,字符集设置为utf8
自己写了个php扩展模块,扩展模块封装了对mysql的操作。比如插入表的操作,可以直接调用一个函数 AddNewDep,这个函数的参数是一个字符串。扩展模块的实现无非是调用sql语句。INSERT INTO table (name,idaddress) VALUES ('%s',1);", name );
其中name是php传过来的值,在扩展模块的程序中name的类型是char*,sql语句也是char*.
这时候如果在扩展模块中打印传入的值,是一堆乱码。
php的页面设置为utf8,在php中调用此模块提供的函数插入值后,该字段是utf8格式的.
这么做了以后,插入到数据库中的中文,是utf-8的,再通过php取数据库中的值,显示也正常。
虽然一切正常,但总觉得奇怪。因为在sql语句中,夹杂了utf-8的数据。sql语句本身是ansi格式。
来解惑,不知道我说清楚没。

解决方案 »

  1.   

    页面设置为gbk的  插入显示也应该正常吧
      

  2.   

    SQL语句也必须是UTF-8格式的。
    mysql_query("SET NAMES UTF8");
      

  3.   

    页面好像也应该是UTF-8格式的。反正我能设置编码方式的地方全都设成UTF-8了,然后就再也没有碰到乱码了。
      

  4.   

    在PHP的连接设置中设置一下字符集。
      

  5.   

    我之前问的两个和乱码有关的问题:
    http://bbs.csdn.net/topics/390416063
    http://bbs.csdn.net/topics/390292319
      

  6.   

    SHOW VARIABLES LIKE 'character%';的结果
    应该是不用 mysql_query("SET NAMES UTF8"); '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/share/mysql/charsets/'我奇怪的地方就在这。php扩展里确实是用的char。我的code
    OpenDatabase,ExecuteSql,FreeRES都是自己写的函数。
    分别调用的 mysql_real_connect,mysql_query,mysql_free_result
    char strSql[256] ={0}; do 
    {
    if ( zend_parse_parameters( ZEND_NUM_ARGS() TSRMLS_CC, 
    "s", &name, &length ) == FAILURE ) 
    {
    break;
    } nRet = OpenDatabase();
    if( nRet != WU_SUCCESS ) break; sprintf( strSql, "INSERT INTO table_department (department_name,department_address,department_parent_id) VALUES ('%s',1,1);", name );
    //php_printf(strSql);
    nRet = ExecuteSql( g_hDB, &resDB, strSql );
    if( nRet != 0 ) break; FreeRES( &resDB );
      

  7.   

    今天又发现sqlite的情况和mysql的情况一样
    我自己做的扩展,分别封装了sqlite和mysql。这样针对不同数据库有统一的调用方法。
    sqlite的code和这个接近。中文字符从php传进来,sql语句用的 char, 没有乱码。但是也不放心,总感觉应该会有乱码。
      

  8.   

    我记得乱码出现是因为 client connect result 三者字符集不一致导致的?只要三者正常转换,不产生字节丢失,都是可以修复的呀,仔细检查检查
      

  9.   

    不知道有没有这些PHP的调试器能不能看到内存中的变量:
    http://www.google.com.hk/#newwindow=1&safe=strict&q=php+debugger&oq=php+debugger&fp=1